大小端

由于各种计算机体系结构对字节、字等的存储机制不同引起的问题。

字节序

大于一个字节类型的数据在内存中的存放顺序。

存放模式

little-endian:地位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

big-endian: 高位字节排放在内存的低地址端,高位字节排放在内存的低地址端。

网络字节序:tcp/ip各层协议使用的是big-endian。

内存中的高低地址端

----------最高内存地址0xffffffff
栈底
栈
栈顶
----------
NULL(空洞)
----------
堆
----------
bbs
----------
data
----------
text
----------最低内存地址0x00000000

big-endian和little-endian的优缺点

big-endian的优点:靠首先提取高位字节,总可以在指针偏移为0的字节来确定这个数十正数还是负数。


判断方法

写一个c函数,若处理器是big-endian,返回0。若是little-endian,返回1。

int checkCPU(void)
{
    union {
        int  a;
        char b;
    }c;
    c.a = 1;
    return(c.b == 1);
}
//剖析:由于联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little- endian还是Big-endian模式读写。
1.在c中,联合体(共用体)的数据成员都是从低地址开始存放。
2.若是小端模式,由低地址到高地址c.a存放为0x01 00 00 00
(gdb) p sizeof(c.a)
$2 = 4
(gdb) p sizeof(c.b)
$3 = 1
(gdb) x/4xb &c.a
0x7fffffffdf60: 0x01    0x00    0x00    0x00
(gdb) x/1xb &c.b
0x7fffffffdf60: 0x01
3.若是大端模式,由低地址到高地址c.a存放为0x00 00 00 01,而c.b指向最低位则0x00
c.a: 0x00 00 00 01
c.b: 0x00

你可能感兴趣的:(大小端)