CPU型号:Intel(R) Core(TM) i5-2450M
系统:windows 10
IDE:Microsoft Visual C++ 6.0(下文中简称VC)
制图软件:Photoshop cs5
预备知识:
1. union的空间大小为以其成员变量中所占最大内存字节数进行内存对齐(VC默认为4字节对齐,,不足4字节补0),所有成员共享同一段内存地址,存放顺序为从低地址到高地址依次存放。
首先介绍下何为大端模式、小端模式以及网络字节:
数据的存储形式是以二进制进行存储的,存储器中的存储单元为一个字节。当数据为多个字节时,就涉及到顺序问题:高位是存在低地址还是高地址?图1详细说明了该问题。
图1
接下来我们用一段C++代码来测试Intel CPU是大端模式还是小端模式:
#include
union
{
char c[4];
int i;
}u;
void main(void)
{
int i=0;
u.i = 0x44332211;
printf("Memories:");
for(i=0;i<4;i++)
printf("%X",u.c[i]);
printf("
Out:%X
",u.i);
}
经过调试可看到u的地址中显示的数据,11对应地址0x00417C78,22对应地址为0x427c79,以此类推:
打印出结果为(16进制表示):
前面输入的数字为0x44332211,内存中低地址存的低位,因此可知本人的电脑为小端模式。
好了,现在有个新问题,前面是将数据存在内存,然后在读出,如果直接往内存中写数据,读出来会不会有点不一样?
#include
union
{
char c[4];
int i;
}u;
void main(void)
{
int i=0;
u.c[0] = 0x1;
u.c[2] = 0x2; //注意,此处u.c[1]并没有写入数据
printf("Memories:");
for(i=0;i<4;i++)
printf("%X ",u.c[i]);
printf("
Out:%X
",u.i);
}
打印结果
(16进制表示):
马虎的人可能会问,结果不是应该是201吗,2跟1分别占一个字节,中间补一个0。这就涉及到二进制了,通过调试可以看到:
一个数字表示4个比特位,而1跟2分别代表4个比特位,比一个字节8个比特位少了4个比特位,因此要补0,打印的结果应该这样看:
一个数字是表示4个比特位,不足位的要补0,不能以十进制的思维想当然!