Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。[低地址放低字节]
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。[低地址放高字节]c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。1.1 什么是高/低地址端首先我们要知道C程序映像中内存的空间布局情况:在《C专 家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:----------------------- 最高内存地址 0xffffffff栈底栈栈顶-----------------------NULL (空洞)-----------------------堆-----------------------未初始 化的数据----------------------- 统称数据段初始化的数据-----------------------正 文段(代码段)
----------------------- 最低内存地址 0x00000000由图可以看出,再内存分布中,栈是向下增长的,而堆是向上增长的。以上图为例如果我们在栈 上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢?看下图:栈底 (高地址)----------buf[3]buf[2]buf[1]buf[0]----------栈顶 (低地址)其实,我们可以自己在编译器里面创建一个数组,然后分别输出数组种每个元素的地址,来验证一
1.2 什么是高/低字节
0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:Big-Endian: 低地址存放高位,如下图:栈底 (高地址)---------------buf[3] (0x78) -- 低位buf[2] (0x56)buf[1] (0x34)buf[0] (0x12) -- 高位---------------栈顶 (低地址)Little-Endian: 低地址存放低位,如下图:栈底 (高地址)---------------buf[3] (0x12) -- 高位buf[2] (0x34)buf[1] (0x56)buf[0] (0x78) -- 低位--------------栈 顶 (低地址)