關於位域習題和知識整理

2021-05-25 20:01:08 字數 1218 閱讀 5423

有些資訊在儲存時,並不需要占用乙個完整的位元組, 而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有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 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,語言提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個型別單元中的二進位劃分為幾個不同的區域,並說明每個區域的位數...