引用鏈接:
其余的參考鏈接:
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 }
位域內存顯示結果: