字节序大小端和位域
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;(数据为0x7200000000,下同)
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
下面的代码可以检测出 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。