引用链接:
其余的参考链接:
https://www.cnblogs.com/bokeyuan-dlam/articles/11677387.html
位域
在某种特定情况下,一个结构体中的多个变量只使用各自存储空间的几位,而其他位从来不使用。这种情况下,可以使用位域来限定每个变量的用来存储数据的位宽。
- 作用
- 限定结构体中变量用来存放数据的位宽,即使用多少位来存储变量
- 注意
-
使用位域的结构体所占的内存空间为结构体中占用内存空间最多的结构体变量所占用的内存空间大小,如:有long和int,最终结构所占的内存空间为long类型所占用的内存空间(8字节)
-
1 #include <stdio.h> 2 3 struct { 4 5 unsigned int intVariable1 : 1; 6 7 unsigned int intVariable2 : 1; 8 9 } intStruct; 10 11 struct { 12 13 unsigned long longVariable : 1; 14 15 unsigned int intVariable : 1; 16 17 } longStruct; 18 19 int main(int argc, const char * argv[]) { 20 21 printf("%zd\n", sizeof(intStruct)); // 结果为:4 22 23 printf("%zd\n", sizeof(longStruct)); // 结果为:8 24 25 return 0; 26 27 }
-
使用位域限制的结构体变量,不可以存储超过限定位宽所能表示的最大范围的变量,否则多余的高位将截断
-
1 // 使用上述的结构体 2 3 int main(int argc, const char * argv[]) { 4 5 intStruct.intVariable1 = 0; 6 7 printf("%d\n", intStruct.intVariable1); 8 9 intStruct.intVariable1 = 1; 10 11 printf("%d\n", intStruct.intVariable1); 12 13 // 下一行会发出警告:Implicit truncation from 'int' to bitfield changes value from 2 to 0 14 15 intStruct.intVariable1 = 3; 16 17 printf("%d\n", intStruct.intVariable1); 18 19 return 0; 20 21 }
-
共用体
共用体是一种数据类型,实现在相同的位置存储不同的数据类型,但是在某一时刻只能保存一种数据。
-
定义方式
-
1 union [union tag] 2 3 { 4 5 member definition; 6 7 member definition; 8 9 ... 10 11 member definition; 12 13 } [one or more union variables];
- 注意
- 共用体所占的内存空间大小为共用体中占用内存空间最多的共用体变量所占的内存空间大小。
- 公用通常应用于几个互斥的变量上
1 //------------------------------------------ 2 // c语言 位域和共用体使用 3 // 简单测试 4 // 5 //eg: 输入一个用24bit的有符号数,如何用int进行存储 6 // 如果简单用位域进行赋值,整数是正确的,但是负数在int,还是一个正数? 7 //解决方法: 用移位运算,<< 8位,再>>8位, 8 // 原理:用移位运算的自动补数的功能,实现 9 // 10 //------------------------------------------- 11 12 #include "gtest/gtest.h" 13 #include <iostream> 14 using namespace std; 15 16 typedef union { 17 struct { 18 int byte1 : 8; // [0:7] 19 int byte2 : 8; // [8:15] 20 int byte3 : 8; // [16:23] 21 int byte4 : 8; // [24:31] 22 }data_bits; 23 int data; 24 }test_union; 25 26 TEST(test_1, test_1_01) 27 { 28 test_union t1; 29 30 // 先设置24位的正数为1 31 t1.data_bits.byte1 = 1; 32 t1.data_bits.byte2 = 0; 33 t1.data_bits.byte3 = 0; 34 t1.data_bits.byte4 = 0; 35 cout << t1.data << endl; // result: 1 36 t1.data <<= 8; 37 t1.data >>= 8; 38 cout << t1.data << endl; // result: 1 39 40 // 先设置24位的负数为 -1 41 t1.data_bits.byte1 = 0xff; 42 t1.data_bits.byte2 = 0xff; 43 t1.data_bits.byte3 = 0xff; 44 t1.data_bits.byte4 = 0; 45 cout << t1.data << endl; // result: 16777215 46 t1.data <<= 8; 47 t1.data >>= 8; 48 cout << t1.data << endl; // result: -1 49 }
位域内存显示结果: