大小端是针对谁说的?
答: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)