【技巧】通过结构体进行的位操作


位域

通过定义相应位域的结构体指针,来访问变量的相应位域数据:

#include <stdio.h>

struct byte {//由低至高
	int a:4;
	int b:4;
	int c:4;
	int d:4;
}* p;

void main(){
	short int b =0xf1ff;
	p = (struct byte*)&b;
	printf("%d\n",&b);	printf("%d\n",p);//输出起始字节地址
	printf("%x\n",p->c);//访问 b 的第 9 到第 12 位
}

输出:

1703724
1703724
1


一个小错误

将:

	short int b =0xf1ff;

改为:

	short int b =0xf8ff;
#include <stdio.h>

struct byte {//由低至高
	int a:4;
	int b:4;
	int c:4;
	int d:4;
}* p;

void main(){
	short int b =0xf8ff;
	p = (struct byte*)&b;
	printf("%d\n",&b);	printf("%d\n",p);//输出起始字节地址
	printf("%x\n",p->c);//访问 b 的第 9 到第 12 位
}

输出不符合预期:

1703724
1703724
fffffff8

为什么?


若改为:

	short int b =0xf7ff;

输出正常:

1703724
1703724
7

为什么 7 正常,而 8 就出问题?
实际上 8 - F 都会有问题。


错误在结构体的定义中:

struct byte {//由低至高
	int a:4;
	int b:4;
	int c:4;
	int d:4;
};

8 的原码为 1 0 0 0,而 int 是 signed 类型,那么首位即为符号位。
符号位为 1 时转 int ,会在高位全部填充1,即 1111 1111 1111 1000,格式化%x输出即为 fffffff8。

而 7 的原码为 0 1 1 1,
符号位为 0 时转 int ,高位全部填充 0 ,也就是 0000 0000 0000 0111,格式化%x输出即为 7。

解决方法1:定义unsigned

struct byte {//由低至高
	unsigned int a:4;//可以不是int ,char ,long , long long等均可
	unsigned int b:4;//如果仅操作而不输出,float ,bool ,double等所有类型均可
	unsigned int c:4;
	unsigned int d:4;
};

解决方法2:输出时转类型

	printf("%x\n",(unsigned int)p->c);
//其他类型也可,取决于程序员你的要求
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高厉害

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值