网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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;
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
pics/618668825)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!