当前位置:编程学习 > C/C++ >>

字符型数组在内存中的存储

[cpp]  
#include <stdio.h>  
int main (void)  
{  
    union b  
    {  
        short k;  //测试环境short占2字节  
        char i[2];  //测试环境char占1字节  
    }*s,a;  
    s=&a;  
    s->i[0]=0x41;  
    s->i[1]=0x52;  
    printf("%x\n",s->k);  
    return 0;  
}  
 
今天做题做了一道很怪异的题目,下面是代码,大家可以先猜一下答案。
 
本人一开始认为运行结果应该为 4152 ,但是在VS2008运行得出的结果竟然是 5241,咦,奇怪,怎么会反过来了呢?
经过一番测试,搜索。发现这个问题涉及到数据在内存存储的问题,也就是字节序的问题(点我查看更多关于字节序的介绍),原来在大部分的机器里面存储字符型数组是在内存中是按照从低位到高位的存储的,就是“0x41”放在内存的低位,“0x52”放到内存的高位,从数组的角度讲就是i[0]存到最低端,然后从低到高一直存。也就是下表的顺序
0x52 0x41
数据在内存中的存储都是二进制的,而且是八位一个字节的。所以i[2]在内存中实际存储为
01010010 01000001
 
由于在共用体里面只能是多选一的,所以变量k的值也是上表一模一样的。转换成16进制数就是 5241 。
这段程序一开始的运行结果容易给人一种假象,就是这段代码把2个数颠倒输出的,其实输出的数就是个“0101001001000001”转化而成的16进制数5241。
这题虽然有点古怪,起码自己编程是不会这样写的,但是通过仔细研究,却了解了数据在内存中是怎样存放的。重在过程。
 
以上全部是本人的肤浅了解,如有错误,欢迎指出。
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,