技巧 通過結構體進行的位操作

2021-09-30 00:27:40 字數 1238 閱讀 1752

通過定義相應位域的結構體指標,來訪問變數的相應位域資料:

#include

struct byte

* p;

void

main()

輸出:

1703724

1703724

1

將:

short

int b =

0xf1ff

;

改為:

short

int b =

0xf8ff

;

#include

struct byte

* p;

void

main()

輸出不符合預期:

1703724

1703724

fffffff8

為什麼?

若改為:

short

int b =

0xf7ff

;

輸出正常:

1703724

1703724

7

為什麼 7 正常,而 8 就出問題?

實際上 8 - f 都會有問題。

錯誤在結構體的定義中:

struct byte 

;

8 的原碼為 1 0 0 0,而 int 是 signed 型別,那麼首位即為符號位。

符號位為 1 時轉 int ,會在高位全部填充1,即 1111 1111 1111 1000,格式化%x輸出即為 fffffff8。

而 7 的原碼為 0 1 1 1,

符號位為 0 時轉 int ,高位全部填充 0 ,也就是 0000 0000 0000 0111,格式化%x輸出即為 7。

解決方法1:定義unsigned

struct byte 

;

解決方法2:輸出時轉型別

printf

("%x\n",(

unsigned

int)p->c)

;//其他型別也可,取決於程式設計師你的要求

C的位結構體

學習c有些時間了,知道有結構體,但是偶然知道它還有位結構體,查了些資料,也做了乙個實驗。1.概念性描述 位結構是一種特殊的結構,在需按位訪問乙個位元組或字的多個位時,位結構比按位運算子更加方便。位結構定義的一般形式為 struct 位結構名 位結構變數 其中 資料型別必須是整型 int char s...

結構體的應用技巧

幾天前同事感覺我們的驅動 中,有幾個地方出錯了。原因是,申請了兩個結構體 a和b 的空間,呼叫mmset 初始化為0後,就直接引用,該結構體a裡的值了,感覺沒做初始化。經過我倆的 得出結論,這是申請結構體空間,巧妙得到結構體b的一種方法。例子如下 include include struct aa ...

Golang通過反射對結構體進行賦值和其他操作

通過反射可以方便快捷地訪問golang的結構體欄位,並進行賦值或其他操作。當兩個結構體內容相同但名字不同時,如何快捷地進行賦值?或者內容有交集,對交集部分進行賦值 package main import fmt reflect type my struct struct type another s...