位域及大小端一题

In little-endian systems, what is the result of following C program ?

 

#include <stdio.h>



typedef struct bitstruct {

  int b1:5;

  int :2;

  int b2:2;

  

} bitstruct;



int main()

{

  bitstruct b;

  memcpy(&b, "EMC EXAMINATION", sizeof(b));

  printf("%d, %d\n", b.b1, b.b2);

  

  return 0;

}

 

结果:

5, -2

析:
1)x86系列的CPU都是小端的。
2)根据位域的定义知 b 占内存空间的9个bit
3)'E'的ASCII值为 0x45其二进制为 0100 0101,'M'的ASCII值为 0x4D 其二进制为0100 1011
4)在小端系统中根据高高低低原则(高位字节存放在高地址处,低位字节存放在低地址处),b 中位域b1 存放在内存低地址处,

b2存放在内存的高地址处。
5)内存分布
一个字节的低bit 放在内存的低bit地址处,假设在32位系统中:

  0x00001000  bit0  1
  0x00001000  bit1  0
  0x00001000  bit2  1
  0x00001000  bit3  0
  0x00001000  bit4  0
  0x00001000  bit5  0
  0x00001000  bit6  1
  0x00001000  bit7  0
  0x00001001  bit8  1

 

b1 使用 bit0 ~ bit4
bit5 ~ bit6 空出
b2 使用 bit7 bit8

这样
b1 的二进制值为: bit4 bit3 bit2 bit1 bit 0 -> 00101 -> 5
b2 的二进制值为: bit8 bit7 -> 10 -> 有符号数转补码表示 10 -> -2

你可能感兴趣的:(大小)