结合Union谈大端模式,小端模式,网络字节

2019-04-14 17:09发布

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,不能以十进制的思维想当然!