位域以及符号扩展的一个小问题

注解
位域:有些信息在存储时,并不需要占用一个完整的字节,而只需要占几个或一个二进制位,例如在存放开关量时,只有0和1两种状态,用1位二进制位即可。为了节省存储空间,并便于处理简便,C语言有提供了一种数据结构,称为位域位段

位域的写法:在结构体定义中,定义变量名的后面加上冒号加上限定的位数。

typedef struct {
	short a;
	short b;
	short c:1; //位域,代表变量c只分配1bit的内存空间
	short reserved : 15;
}_FORTEST;

问题:有如下代码

#include<stdio.h>

typedef struct {
	short a;
	short b;
	short c:1; //使用位域,指示编译器c只用1位进行存储
	short reserved : 15;
}_FORTEST;

int main()
{
	_FORTEST f;
	f.a = 100; f.b = 200; f.c = 1;
	f.c &= 0x01;
	printf("十进制:a = %d b = %d c = %d\r\n",f.a,f.b,f.c);
	printf("十六进制:a = %#x b = %#x c = %#x",f.a,f.b,f.c);
	return 0;
}

运行结果为

十进制:a = 100 b = 200 c = -1
十六进制:a = 0x64 b = 0xc8 c = 0xffffffff

其中

f.a = 100; f.b = 200; f.c = 1;

由于f.c占1位,所以f.c的补码即 1

f.c &= 0x01;

该语句使得f.c与0x01相与,所得结果为0x1(因为f.c仅占1位)

	printf("十进制:a = %d b = %d c = %d\r\n",f.a,f.b,f.c);
	printf("十六进制:a = %#x b = %#x c = %#x",f.a,f.b,f.c);

输出f.c时:都是要将f.c扩展至4字节(32bit),而此时f.c只有1bit,唯一剩下的数据位即代替符号位进行符号扩展,所以扩展后二进制补码为32个1,即为10进制的-1,以及16进制的0xffffffff

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值