举个例子来说名大小端: 比如一个int x, 地址为0x100, 它的值为0x1234567. 则它所占据的0x100, 0x101, 0x102, 0x103地址组织如下图:
0x01234567的MSB为0x01, LSB为0x67. 0x01在低地址(或理解为"MSB出现在LSB前面,因为这里讨论的地址都是递增的), 则为大端; 0x67在低地址则为小端.
认清这样一个事实: C中的数据类型都是从内存的低地址向高地址扩展,取址运算"&"都是取低地址. |
两个测试Bit Endian的小程序
method_1
#include <stdio.h> |
int c 在内存中的表达为: 0x 00 000001 . (这里假设int为4字节). 用char可以截取一个字节. LSB为0x01, 若它出现在c的低地址, 则为小端.
method_2
#include <stdio.h> |
union中元素的起始地址都是相同的——位于联合的开始. 用char来截取感兴趣的字节.
区分大端与小端有什么用呢? 如果两个不同Endian的机器进行通信时, 就有必要区分了 |