C语言结构体位域中元素可以是哪些整型(char unsigned char int unsigned int) _c位域可以用有符号数

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

struct {
	unsigned a:8;
	unsigned b:16;
	char c:8;
}bitField;

}A;


这种使用方法,我们只需要对d进行赋值,就可以同时对位域内所有元素进行赋值。




---


下面我们测试一下在位域中是否可以显示有符号数



#include <stdio.h>

typedef union {
unsigned int d;
struct {
unsigned a:8;
unsigned b:16;
char c:8;
}bitField;
}A;

int main(){
A test;
test.bitField.a = 0xff;
test.bitField.c = 0xff;
printf(“%d\n”,test.bitField.a);
printf(“%d\n”,test.bitField.c);
return 0;
}


![image-20210718005554003](https://img-blog.csdnimg.cn/img_convert/42620b94443851731607f552b61d135a.png)


可以看到对于unsigned无符号数将二进制表示11111111解释成了255


对于char有符号数将二进制表示11111111解释成了-1


因此在位域中是可以使用有符号数的,只要我们对该元素进行有符号数的声明即可。




---


现在我们知道在位域中可以定义各种类型的整型元素,包括char|unsigned char|int|unsigned int等,但是要注意的是,当你将一个元素声明为unsigned char之后,如果该元素的内存占用不足8位的话,那是达不到unsigned char的[0,255]范围。



#include <stdio.h>

typedef union {
unsigned int d;//int d也可以
struct {
unsigned char a:7;
unsigned b:17;
char c:8;
}bitField;
}A;

int main(){
A test;
test.bitField.a = 0xff;
printf(“%d\n”,test.bitField.a);
return 0;
}


![https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210718011100560.png](https://img-blog.csdnimg.cn/img_convert/2498d29b6e0bcbf3e3515ece20227331.png#pic_center)


可以看到我们将a元素声明为unsigned char类型,但是其只占7比特,当我们把0xff(二进制表示11111111)赋值给a,a因为内存不够,会发生高位截断,因此a的二进制表示为1111111,其十进制值是127


下面我们试试当我们定义的元素位数大于整型类型的位数时,会咋样?



#include <stdio.h>

typedef union {
int d;
struct {
unsigned char a:9;

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

pics/618668825)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值