通過定義相應位域的結構體指標,來訪問變數的相應位域資料:
#include
struct byte
* p;
void
main()
輸出:
17037241703724
1
將:
short
int b =
0xf1ff
;
改為:
short
int b =
0xf8ff
;
#include
struct byte
* p;
void
main()
輸出不符合預期:
1703724為什麼?1703724
fffffff8
若改為:
short
int b =
0xf7ff
;
輸出正常:
1703724為什麼 7 正常,而 8 就出問題?1703724
7
實際上 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...