本文主要是介绍结合Union谈大端模式,小端模式,网络字节,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 <stdio.h>
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("\nOut:%X\n",u.i);}
经过调试可看到u的地址中显示的数据,11对应地址0x00417C78,22对应地址为0x427c79,以此类推:
前面输入的数字为0x44332211,内存中低地址存的低位,因此可知本人的电脑为小端模式。
好了,现在有个新问题,前面是将数据存在内存,然后在读出,如果直接往内存中写数据,读出来会不会有点不一样?
#include <stdio.h>
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("\nOut:%X\n",u.i);}
打印结果(16进制表示):
马虎的人可能会问,结果不是应该是201吗,2跟1分别占一个字节,中间补一个0。这就涉及到二进制了,通过调试可以看到:
一个数字表示4个比特位,而1跟2分别代表4个比特位,比一个字节8个比特位少了4个比特位,因此要补0,打印的结果应该这样看:
一个数字是表示4个比特位,不足位的要补0,不能以十进制的思维想当然!
这篇关于结合Union谈大端模式,小端模式,网络字节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!