#include <stdio.h> #include <string.h> typedef struct A{ int a:5; int b:3; unsigned c:8; unsigned d:8; } Type_A; /* VS2010, Windows XP, Debug模式下运行 */ int main(void) { struct A a; char s[]="12345678"; printf( "%d\n",sizeof(Type_A) );//4 printf("%d\n",sizeof(a));//4 memcpy(&a,s,3); printf("%d\n",a.a);//‘1‘的低位 -15 printf("%d\n",a.b);//‘1‘的高位 1 printf("%d\n",a.c-‘0‘);//‘3‘ 51 printf("%d\n",a.d-‘0‘);//‘4‘ 52 return 0; }
‘1‘(49)的二进制 00110001,
a.a=10001 (-15)
a.b=001 (1)
由A的定义已知a.a(10001)是代表一个有符号的int型,
先执行符号位扩展得到11110001,
再减一得到11110000,
再取反得到10001111,就是-15的源码了.
所以a.a的值为-15, 同理,a.b为1。
参考:
http://www.cnblogs.com/bigrabbit/archive/2012/09/20/2695543.html
[整理]C结构实现位段(bit field),布布扣,bubuko.com
原文地址:http://www.cnblogs.com/Benoly/p/3848643.html