首页 > 代码库 > 字节序问题
字节序问题
1. 在设计计算机时,有两个不同的体系结构来处理内存存储区,他们被称为大字节序和小字节序。字节序是一个处理器架构特性,用于指示像整数这样大数据类型的内部字节顺序。几乎所有的机器上,多字节对象都被存储为连续的字节序列。 运行在同一台电脑上的进程在在英特尔的计算机上,低位字节被优先存储。这意味着像 0x1234 十六进制单词存储作为 (0x34 0x12) 在内存中。对于四个字节的值 ;例如,0x12345678 将存储为 (0x78 0x56 0x34 0x12)。"较大的一端在"这样做是以相反的方式,因此 0x1234 作为 (0x12 0x34) 存储在内存中。
2. 类比一下,其实这个字节序跟我们书写方式差不多。我们可以把一行的开始当作内存的低地址,在书写数字的时候我们会把高位写在前面,这就是人类的存储方式。对于计算机来说也一样,它同样需要一种存储方式,先存低位(小端)或者先存高位(大端)。可以看出,人类的书写方式相当于计算的大端存储。
3.什么时候要考虑字节序问题呢?
再拿我们书写方式举例。我们自己写的字怎么看,代表什么意思我们肯定很清楚。但是如果你是个天才,书写时总是先写低位,我想一般人肯定会误解。对计算机也一样,不同的cpu可能有不用的字节序,所以在不用cpu之间处理数据时难免会被误解。综上,当要在不同计算机(cpu)之间处理数据时,一定要考虑字节序问题。
4.如何判断当前机器的字节序呢?
一个简单的办法是,给一个整数赋个值0x04030201。然后让一个char类型的指针指向这个整数,打印这个char,就可以知道字节序了。代码如下
#include <stdio.h> int main(void) { int iNum = 0x04030201; char *pcNum = &iNum; if (*pcNum == 0x04) puts("big edum\n"); else if (*pcNum == 0x01) puts("small edum\n"); return 0; }
附上一个记忆口诀:低地址存低位为小端,低地址存高位则大端。
字节序问题