聊聊C語言中的位段 位域

2021-06-28 12:54:29 字數 987 閱讀 4449

我們知道, 在c中, char佔據8的位, 你可以這麼理解: 乙個廁所有8個坑位, 剛好組成乙個char.   在32位機器上, 乙個int占領32個坑位, 一眼望去, 就是32個坑, 何其壯觀。 如果有人蹲在其中, 表示1, 如果沒有人蹲在其中, 表示0.

有時候, 需要用乙個變數表示「開/關」狀態, 說白了, 也就是0和1. 如果用int, 那其餘的31個坑位不是被浪費了麼? 即使是用char, 那也會浪費另外的7個坑位。 此時, 我們可以用c語言中的位段來做。

我們先來簡要感知一下:

#includeint main()

t1; t1.a = 0;

t1.b = 1;

t1.c = 0;

printf("%u, %u, %u\n", t1.a, t1.b, t1.c);

return 0;

}

我們要注意, 乙個位段必須位於同乙個位元組內, 不允許跨越, 所以乙個位段的長度不能大於8位, 否則可能截斷, 如下:

#includeint main()

t1; t1.a = 4; // ...0100, 取最後1位, 所以是0

t1.b = 5; // ...0101, 取最後2位, 所以是1

t1.c = 6; // ...0110, 取最後1位, 所以是0

printf("%u, %u, %u\n", t1.a, t1.b, t1.c); // 0, 1, 0

t1.a = 9; // ...1001, 取最後1位, 所以是1

t1.b = 10; // ...1010, 取最後2位, 所以是2

t1.c = 11; // ...1011, 取最後1位, 所以是1

printf("%u, %u, %u\n", t1.a, t1.b, t1.c); // 1, 2, 1

return 0;

}

好的, 位段到此為止, 算是有個基本認識了。

C語言中的位段(位域)知識

在結構體或類中,為了節省成員的儲存空間,可以定義某些由位組成的字段,這些字段可以不需要以byte為單位。這些不同位長度的字段 實際儲存於乙個或多個整形變數。位段成員必須宣告為int,signed int,unsigned int型別。在成員的後面是乙個冒號和乙個整數,這個整數指定該位段所占用的位的數...

C語言中位域

引自 這是c語言位域 冒號 問題 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為...

C語言中的位域

struct 位域結構名 1 使用位域可能不如使用位運算子的執行速度快,但是位域使程式更容易閱讀。2 如果某個作用域中定義了位域結構,則在該作用域中就不能使用typedef或 define來定義與位域結構名相同的型別名。3 在之前的標準中,位域型別必須是int unsigned int或signed...