字节序大小端和位域

50 阅读2分钟

字节序大小端和位域

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;(数据为0x7200000000,下同)

image.png

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

image.png

下面的代码可以检测出 CPU 的大小端模式:

    int m = 0x1234;
    char n = *((char*)(&m));
    cout << (n == 0x12) << endl; // true则是大端模式
    cout << (n == 0x34) << endl; // true则是小端模式
复制代码

由于涉及到进位运算,CPU 都会先从低字节的数据开始执行运算过程,再加上计算机的寻址方式是从低地址向高地址进行迁移。所以在以上两种方式中,唯有小端模式能够使 CPU 以最小的开销完成计算。

位域或者位段可以节省存储空间。把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

struct S1 {
    int i:8;
    char j:4;
    int a:4;
    // double b;
};
复制代码

结构体S1中,i占8bit,j占4bit,a占4bit。给各域名赋值:

    S1 s = {0};
    s.i = 3;
    s.j = 2;
    s.a = 1;
复制代码

依次打印s对象内存值为(小端):3, 18, 0, 0。 第一个字节为s.i(0x03);第二个字节为s.j和s.a共用,其中低4位是j,高4位是a,故而其值为0001 0020(18)。后两个字节为初值0。