㈠ c語言結構體問題
結構體里的冒號「:」
位結構是一種特殊的結構, 在需按位訪問一個位元組或字的多個位時, 位結構
比按位運算符更加方便。
位結構定義的一般形式為:
struct位結構名{
數據類型 變數名: 整型常數;
數據類型 變數名: 整型常數;
} 位結構變數;
數據類型必須是int(unsigned或signed)。 整型常數必須是非負的整
數, 范圍是0~15, 表示二進制位的個數, 即表示有多少位。
變數名是選擇項, 可以不命名, 這樣規定是為了排列需要。
struct id_flag
{ unsigned is_keyword:1;
unsigned is_external:1
unsigned is_static:1;
}flag;
本例定義了is_keyword、is_external、is_static三個位欄位,它們各佔1位(1bit)存儲空間。同時,也定義了一個名為flag的struct id_flag類型的結構體變數。
這個是位結構,因為是整形的 所以整個位結構是4個位元組
㈡ C語言中的位欄位結構
因為你定義的位欄位只能有兩位二進制位
3的二進制是11
4的二進制是100
所以賦值4的話就會超出一位,出錯
㈢ C語言中的位欄位存的數字用什麼運算符輸出
int型變數定義長度分別為4bit,2bit,2bit,2bit 如果看到具體值最好用%X 16進制輸出,當然也可以用 %d,%u都能看到其值的范圍!
㈣ C語言中bool是佔用1位元組嗎如果只佔用一位怎麼做呢
LS的朋友,其實
m_a
和
m_b的卻只是各佔了一個位
不過事實上他們還是佔了一個位元組,只是這個位元組剩下的6bit沒有用而已
==
㈤ c語言問題1
一、sizeof的概念
sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它並不是函數。sizeof操作符以位元組形式給出了其操作數的存儲大小。操作數可以是一個表達式或括在括弧內的類型名。操作數的存儲大小由操作數的類型決定。
二、sizeof的使用方法
1、用於數據類型
sizeof使用形式:sizeof(type)
數據類型必須用括弧括住。如sizeof(int)。
2、用於變數
sizeof使用形式:sizeof(var_name)或sizeof var_name
變數名可以不用括弧括住。如sizeof (var_name),sizeof var_name等都是正確形式。帶括弧的用法更普遍,大多數程序員採用這種形式。
注意:sizeof操作符不能用於函數類型,不完全類型或位欄位。不完全類型指具有未知存儲大小的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。
如sizeof(max)若此時變數max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式。
三、sizeof的結果
sizeof操作符的結果類型是size_t,它在頭文件<stddef.h>中typedef為unsigned int類型。該類型保證能容納實現所建立的最大對象的位元組大小。
1、若操作數具有類型char、unsigned char或signed char,其結果等於1。
ANSI C正式規定字元類型為1位元組。
2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double類型的sizeof 在ANSI C中沒有具體規定,大小依賴於實現,一般可能分別為2、2、2、2、4、4、4、8、10。
3、當操作數是指針時,sizeof依賴於編譯器。例如Microsoft C/C++7.0中,near類指針位元組數為2,far、huge類指針位元組數為4。一般Unix的指針位元組數為4。
4、當操作數具有數組類型時,其結果是數組的總位元組數。
你是不是把 aizeof(x)寫錯了。應該是sizeof(x),
㈥ 結構體中位域欄位與非位域欄位混合使用的問題,求教
補充一下樓上不確定的地方,以下是C語言的規則:
位欄位是有符號和無符號的區別,在聲明上不一樣。
表達式中,所有小於int類型的整數都會提升為int類型,提升方式是符號位擴展。入參也是一種表達式。
表達式中有數據無法用int表達時,所有數據會提升為unsign int,提升方式是左側補0。
printf對所以%d對應的入參都當成有符號類型,而不管原類型是什麼,例如你提供0xFFFFFFFFU,它會輸出-1.
print...it.a 這個表達式的執行過程是:
it.a其實沒有真正的值,因為它只有符號位。
it.a提升到int類型,符號位擴展達32個1,值為-1
printf收到數據,解釋為int,就是-1
輸出-1
當it.a是無符號數時
it.a的值為1
it.a提升到unsign int類型,直接左側擴展31個0,值為1
printf收到數據,解釋為int,就是1
輸出1
㈦ C語言中的位欄位
您可以使用未命名的欄位主動製造出未命名位。
使用一個寬度為0的未命名欄位則會迫使下一個欄位與下一個unsigned int對齊
㈧ C語言問題:結構體裡面的成員,如果想按位訪問。。。
不同的編譯器對位欄位有不同的類型範圍,GCC以及VC++就不允許數組位欄位,而BCB則允許
㈨ 關於C語言位欄位,是不能使用scanf();獲取標簽的地址嗎因為它提示我「不能採用位域的地址」,謝謝解答
直接這樣是不行的,bit field並不是處在單個位元組的開頭處,不能直接用地址
需要用局部整型變數,scanf後再賦值
㈩ c語言位操作的位欄位填充
注意這里兩個「位」是不一樣的。
1)冒號後面的數值是比特位bit
2)類型位數描述用的是位元組byte,1byte=8bit
----
int類型==4byte==32bit
----
上面的box_props一共16bit=2位,僅相當於一個short類型變數