Little-Endian or Bigger-Endian?

大小端是针对谁说的?

答: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)

你可能感兴趣的:(Little,大小端,endian,endian,bigger)