分类: C/C++
2017-04-22 15:06:09
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。
举例:
数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。
大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。
怎么去记才不会出错呢?
其实只需要记住小端是低位字节存低位数据,高位字节存高位数据。(称为:低低高高)
同理:0x1234567的大端字节序和小端字节序的写法如下图:
由图中可以看出:大端小端字节序最小单位为1字节,即8bit;大端字节序就是和我们平时写法的顺序一样,从低地址—>高地址写入0x01234567;而小端字节序就是和我们平时的写法反过来,因为字节序最小单位为1字节,所以从低地址—>高地址写入0x67452301。
我一直不理解为什么要有字节序,每次读写都要区分,很麻烦!觉得统一使用大端字节序,就很方便。
读了一篇文章,解答了所有的疑问,首先,为什么要有小端字节序?
原因是:计算机电路优先处理低位字节,效率比较高,因为计算机都是从低位开始的。所以计算机内部处理都是小端字节序。
但是人类习惯读写大端字节序,所以除了计算机的内部处,其他的场理合都是大端字节序,比如网络传输和文件储存。
计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读入第一个字节,再读第二个字节。如果是大端字节序,先读到的是就是高位字节,后读到的就是低位字节。小端字节序正好相反。
字节序的处理:只有读取的时候,才必须区分字节序,其他情况都不用考虑。点击(此处)折叠或打开
点击(此处)折叠或打开
2.在X86系统下,分别在大端模式和小端模式下,下面函数的值是多少,为什么,请画图说明?
int main()
{
int a[4] = {1, 2, 3, 4};
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf(“%x, %x”, ptr1[-1], *ptr2);
return 0;
}
我们知道a表示数组首元素的首地址,(int *)(&a+1)就是把&a加1,再转化为int *,因为&a+1就指向a[5]了,ptr1[-1]又相当于ptr1指向了a[4];