有些資訊在儲存時,並不需要占用乙個完整的位元組, 而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為「位域」或「位段」。所謂「位域」是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有乙個網域名稱,允許在程式中按網域名稱進行操作。 這樣就可以把幾個不同的物件用乙個位元組的二進位制位域來表示
1)#include
#include
#include
typedef struct aa
aa;void main()
首先sizeof(aa)的大小為4,b1和b2分別佔5bit和2bit.
經過strcpy和memcpy後,aa的4個位元組所存放的值是:
0,1,2,3的asc碼,即00110000,00110001,00110010,00110011
所以,最後一步:顯示的是這4個位元組的前5位,和之後的2位
分別為:10000,和01
因為int是有正負之分 所以:答案是-16和1
2)定義乙個結構體,一共有16位,變數a(0-3位),變數b(8-11位),變數c(12-15位)。
一共兩種方法:
struct bs
struct bs 3)
#pragma pack(1)
struct a
sizeof(a)
把注釋去掉和不去掉都是一樣的,答案是3,這樣可以看出雖然沒有按大家一般關注的記憶體邊界對齊(我已經設為1位元組對齊了),而是按照的型別邊界對齊的。
也就是說如果你定義的是short,不管用了幾位它都會把剩下的位用完。
short兩位元組,16位,雖然沒有用剩下8位,但算所佔空間的時候都要算進去。
struct a
這個列子更明顯了。
#pragma pack(4)
struct a
結果是6
當前最大的型別是short占用2個位元組
雖然是按四個位元組對齊,但是仍然t佔2位元組,i佔兩位元組,k佔兩位元組
struct s1
;struct s2
;printf("sizeof(s1)= %d/n", sizeof(s1));
printf("sizeof(s2)= %d/n", sizeof(s2));
16, 24
這個跟剛才的很像,只是說s1先把int佔滿後才開闢b;
位運算知識整理
位運算操作符 位邏輯非運算 位邏輯與運算 位邏輯或運算 位邏輯異或運算 位左移運算 位右移運算using system using system.collections.generic using system.linq using system.text namespace 集合 renum 如果...
關於位運算的習題
程式設計基礎 c語言 楊莉 劉鴻翔 isbn 978 7 03 032903 5 p 165 166 習題67.閱讀程式輸出結果 比較運算子表示式為1,即為真,為0,即為假 按位與 格式 x y 規則 參與運算的兩數對應的二進位制位相與,只有對應的兩個二進位制位均為1時,結果位才為1,否則為0 參與...
關於位域的理解
有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,語言提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個型別單元中的二進位劃分為幾個不同的區域,並說明每個區域的位數...