关于大字节序和小字节序
大字节序:把高有效位放在低地址段,例如在按字节寻址的存储器中往地址 0x0001 存放值 0x12345678,在存储器中为
地址 数值
0x0004 0x78
0x0003 0x56
0x0002 0x34
0x0001 0x12
小字节序:把低有效位放在低地址段,例如在按字节寻址的存储器中往地址 0x0001 存放值 0x12345678,在存储器中为
地址 数值
0x0004 0x12
0x0003 0x34
0x0002 0x56
0x0001 0x78
在传输半字,字,双字的时候,读取地址时总是由低往高,通常 x86 等指令集用的是小字节序,RISC 等其他指令集用大字节序。在同一指令集中进行数据传输不需要进行字节序转换,在不同的指令集之间进行传输时需要进行字节序转换,如进行网络传输。网络传输用的都是大字节序。
历史:网络由 University of California Berkeley 开发,当时用的是 RISC 指令集。为大字节序,从此以后网络传输为大字节序。
---------------------------------------------------------------------------
对 C 编程的影响
参考下例 (编译运行于 32 位 x86 机器,小字节序):
#include <stdio.h>
typedef struct
{
union
{
unsigned char str[3];
unsigned long a;
unsigned short b;
};
} test;
int main(int argc, char * argv[])
{
test m;
m.a = 0x002233ff;
printf("%p %p %p/n", m.str, &m.a, &m.b);
printf("0x%x/n", m.b);
printf("%u %u/n", m.str[0], m.str[3]);
return 0;
}
输出结果为:(其中第一行的值可能会变化,但不管怎么变,三个值肯定是相同的)
0xbfd4d1d0 0xbfd4d1d0 0xbfd4d1d0
0x33ff
255 0
关于大字节序和小字节序
最新推荐文章于 2024-10-23 07:46:12 发布