字节序

1.什么是字节序

    字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。由于数据在内存中存储的顺序与操作系统有关,因此字节在主机中的存储顺序通常称为主机序;而数据在网络中的存储顺序则称为网络序。

    常见的字节序有:大端字节序(Big endian)与小端字节序(Little endian)。

    主机序依CPU而定:Intel x86为Little endian,Motorola680x则是Big endian。

    网络序与CPU无关都是Big endian, 这是因为统一字节序有利于数据在不同主机之间的传递。另外采用Big endian传输也是为了使重要的数据先传输,这样即使后面的低字节丢失,信息的失真度也会较小。

2.大端字节序(Big endian)

    所谓大端字节序是指数据的高位存储在地址的低位,数据的低位存储在地址的高位。(高位低地址,低位高地址)

3.小端字节序(Little endian)

    所谓小端字节序是指数据的低位存储在地址的低位,数据的高位存储在地址的高位。(低位低地址,高位高地址)

4.表现形式

    以多字节数据0x12345678为例,假设该数据在CPU中的内存地址为0x1000,则大小端字节序模式下,各字节的存储地址为:

地址 大端 小端
0x1000 0x12 0x78
0x1001 0x34 0x56
0x1002 0x56 0x34
0x1003 0x78 0x12

5.意义

    为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

 

6.如何区分CPU是大端还是小端

    在实际编程中,我们可以通过下面的代码段判断CPU是大端还是小端:

union
{
    short n;
    char ch[2]; 
}Endian = {0x1234};

#if (Endian.ch[0] == 0x12)
#define Big_Endian 1
#else
#define Big_Endian 0
#endif

 或者下面的方法:

  原文链接:https://stackoverflow.com/questions/2100331/c-macro-definition-to-determine-big-endian-or-little-endian-machine

#ifndef ORDER32_H
#define ORDER32_H

#include <limits.h>
#include <stdint.h>

#if CHAR_BIT != 8
#error "unsupported char size"
#endif

enum
{
    O32_LITTLE_ENDIAN = 0x03020100ul,
    O32_BIG_ENDIAN = 0x00010203ul,
    O32_PDP_ENDIAN = 0x01000302ul,      /* DEC PDP-11 (aka ENDIAN_LITTLE_WORD) */
    O32_HONEYWELL_ENDIAN = 0x02030001ul /* Honeywell 316 (aka ENDIAN_BIG_WORD) */
};

static const union { unsigned char bytes[4]; uint32_t value; } o32_host_order =
    { { 0, 1, 2, 3 } };

#define O32_HOST_ORDER (o32_host_order.value)

#endif

 

 

 

posted @ 2017-04-03 22:22  pry_up  阅读(527)  评论(0编辑  收藏  举报