您的位置:首页 > 其它

大端模式与小端模式

2016-02-21 10:36 288 查看
小端机(Little-Endian)/大端机(Big-Endian)

Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

Intel X86 平台一般为小端机

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:

大端模式:

低地址 —————–> 高地址

0x12 | 0x34 | 0x56 | 0x78

小端模式:

低地址 ——————> 高地址

0x78 | 0x56 | 0x34 | 0x12

大端小端没有谁优谁劣,各自优势便是对方劣势:

小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。

大端模式 :符号位的判定固定为第一个字节,容易判断正负。

大小端的判断

使用 union

bool isLittleEndian()
{
union
{
int a;
char b;
} foo;
foo.a = 1;
// 00 00 00 01
return foo.b == 1;
// 保留最前的 00,也即高位字节存放在低地址,为大端机
// 还是最后的 01,也即低位字节存放低地址,为小端机
}


int ==》 char[4]

仍然是妙不可言的 union

union
{
unsigned int a;
unsigned char buf[4];
} foo;
foo.a = 0x12345678;
printf("%x, %x, %x, %x\n", foo.buf[0], foo.buf[1], foo.buf[2], foo[3]);
// 小端机的输出为:78, 56, 34, 12
// 大端机的输出为:12 34 56 78


方法之二:

unsigned int a = 0x12345678;
unsigned char bytes[4];
bytes[0] = (a >> 24) & 0xff;
bytes[1] = (a >> 16) & 0xff;
bytes[2] = (a >> 8) & 0xff;
bytes[3] = a & 0xff;


References

[1] Converting an int into a 4 byte char array (C)

[2] 详解大端模式和小端模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: