==作者:YB-Chi==
[toc]
在内存中有两种数据存放模式,即大端模式和小端模式,它们讨论的无非是下面这个问题:
数据的高字节存放在地址的高位还是低位
下面以32bits的数据32’h01234567为例
大端模式:数据高字节(MSB)应该存放在低地址,这和我们的阅读习惯一致。
1
2低地址 -----> 高地址
0x01 | 0x23 | 0x45 | 0x67 从低到高读小端模式:数据低字节(LSB)才应该存放在低地址,这将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
1
2低地址 -----> 高地址
0x67 | 0x45 | 0x23 | 0x01 从高到低读
大小端的使用状况
- Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。
- 网络协议规定接收到的第一个字节是高字节存放低地址,或说TCP/IP协议规定把接收到的第一个字节当做高位看待,这就要求发送端发送的第一个字节是高字节
大小端各自的优劣
大端模式:符号位在所表示的数据的内容的第一个字节中,便于快速判断数据的正负和大小
小端模式:低地址放低字节,所以在强制转换时不需要调整字节的内容;CPU做数值运算时从内存中依次从低到高取数据进行运算直到最后刷新最高位的符号位,这样运算方式会更高效。