您的位置:首页 > 其它

Little-Endian or Bigger-Endian?

2016-04-17 16:37 211 查看
大小端是针对谁说的?

答:CPU,采用小段模式的CPU操作数据时将操作数的低字节放到内存的低地址,采用大端模式的CPU会将操作数的低字节放到内存的高地址。

先看几个常识:

1)字符'A',十进制为65,十六进制为0x41,八进制为0101

2)系统对一个数据寻址时,总是从低字节的地址开始。

3)系统对一个对象的存储是将对象中的一个字节一个字节依次存储的。

3)int n; 整形变量占有4个字节,因为sizeof(int)=4

4)上面的n的从低地址的字节内容到高地址的字节内容,每个内容可以通过以下取值方式依次获取得到:

((char*)&n)[0],((char*)&n)[1],((char*)&n)[2],((char*)&n)[3]

5)假如int n = 0x41424344;,则n对象的低字节内容到高字节内容依次为:

0x44,0x43,0x42,0x41

知道了上述常识,判断大小端就很容易了:

bool little_endian()

{

int n = 0x41424344;

return ((char*)&n)[0] == 0x44 ? true : false;

}

bool bigger_endian()

{

int n = 0x41424344;

return ((char*)&n)[0] == 0x41 ? true : false;

}

也有使用union来判断大小端的,这是利用了union内每个变量的首地址是相同的特性。

bool little_endian()

{

union MyUnion{

int n;

char ch;

};

MyUnion u;

u.n = 0x41424344;

return u.ch == 0x44 ? true : false;
//< 利用了 assert( &(u.ch) == &(((char*)&u.n)[0]));特性,等效于return ((char*)&u.n)[0] == 0x44 ? true : false;

}

(END)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: