代码改变世界

[整理]C结构实现位段(bit field)

2014-07-16 14:36  Benoly  阅读(290)  评论(0编辑  收藏  举报
#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