C++大端模式和小端模式

来源:互联网 发布:h5自助建站系统源码 编辑:程序博客网 时间:2024/05/16 06:29

在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机、通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常才用的字节存储机制主要有两种--Big-Endian和Little-Endian。

标准的Big-Endian和Little-Endian的定义如下:

a) Little-Endian: 低字节排放在内存的低地地址端,高字节排放在内存的高地址端。

b) Big-Endian: 高字节排放在内存的低地址端,低字节排放在内存的高地址端。

c) 网络字节序: TCP/IP各层协议将字节序定义为Big-Endian, 因此TCP/IP协议中使用的字节序通常称之为网络字节序。

以64位系统为例, 定义如下结构体和fool函数, 求fool函数的执行结果


struct st_task{    uint16_t id;    uint32_t value;    uint64_t timestamp;};void fool(){    st_task task = {};    uint64_t a = 0x00010001;    memcpy(&task, &a, sizeof(uint64_t));    printf("%11u,%11u,%11u", task.id, task.value, task.timestamp);}

因此,采用小端对齐后的运行结果为 1,0, 0

Big_Endian 和 Little-Endian的优缺点

Big-Endian优点:靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是 正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。

Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对一的关系,多重精度的数学函数就相对地容易写了。

如果你增加数字的值,你可能在左边增加数字(高位非指数函数需要更多的数字)。 因此, 经常需要增加两位数字并移动存储器里所有Big-endian顺序的数字,把所有数向右移,这会增加计算机的工作量。不过,使用Little- Endian的存储器中不重要的字节可以存在它原来的位置,新的数可以存在它的右边的高位地址里。这就意味着计算机中的某些计算可以变得更加简单和快速。


原创粉丝点击