一. 概念
字节序,就是 大于一个字节类型的数据在内存中的存放顺序。是在跨平台和网络编程中,时常要考虑的问题。
二.分类
字节序经常被分为两类:
- Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
- Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
三.为什么要分大小端
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
四. 高低地址与高低字节
3.1 高低地址
C程序映射中内存的空间布局大致如下:
最高内存地址 | 0xFFFFFFFF |
---|---|
栈区 | 从高内存地址,往 低内存地址发展。即栈底在高地址,栈顶在低地址 |
堆区 | 从低内存地址 ,往 高内存地址发展 |
全局区 | 常量和全局变量 |
代码区 | |
最低内存地址 | 0x00000000 |
3.2 高低字节
在十进制中靠左边的是高位,靠右边的是低位,在其他进制也是如此。例如 0x12345678,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
网络字节序 就是 大端字节序:4个字节的32 bit值以下面的次序传输,首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit
主机字节序 就是 小端字节序,现代PC大多采用小端字节序。
五、例子
对于数据 0x12345678,假设从地址0x4000开始存放,在大端和小端模式下,存放的位置分别为:
- 采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节
- 而Big-endian模式对操作数的存放方式是从高字节到低字节。
小端存储后:0x78563412 大端存储后:0x12345678
六. 如何判断大小端
那么问题来了,如何写程序判断机器的存储方式呢?(即“大端存储”还是“小端存储”)
例如:0x2345678在内存中是以78 56 34 12的方式存放的,可以看到变量i每个字节的内容,从而轻易的判断出它是小端存储。
写程序判断其实也是这样的思路:想办法取出一个字节的内容,就可以知道是哪种存储方式。比如,某个变量是4个字节,我们只要取出它的第一个字节内容,如果是78,则说明是小端存储;反之是大端。