2012-10-04 31 views
2

我試圖更多地瞭解位字段的工作原理。初始化包含位字段的結構C

考慮下面的代碼: 並假設int是32位

#include <stdio.h> 

int main() 
{ 
    struct byte 
    { 
     int one:1; 
    }; 
    struct byte var = {3}; 
    printf("%d\n", var.one); 
    printf("%#x\n", var); 
    return 0; 
} 

我得到的輸出是:

 
-1 
0x1 

但是我期待看到:

 
-1 
0x3 

由於

struct byte var = {3}; 

給int的4個字節賦值3,不是嗎?

從輸出我實際得到它看起來好像上面的代碼行試圖將值3存儲到1位字段,因此打印0x1作爲第二個輸出行。

所以我的問題是:

如何這些初始化和任務對整個結構的工作嗎?

另外,爲什麼需要{}

+4

你爲什麼期望?您有一個分配給1位寬的字段。編譯器沒有義務保留額外的位。 –

+0

@JonathanGrynspan謝謝你指出。但是,如果編譯器將忽略其餘位,爲什麼需要爲每個位域指定一個類型? – pablorg

+0

嘗試打印'struct byte {TYPE var:1; };'用不同的類型'(unsigned)int/char'。很可能你會發現一個區別。 –

回答

4
int one:1; 

用這個,你聲明一個int只有一個位用於sign位。所以你看到-1

如果你想存儲3(011),那麼你需要總共有2個(數據)+1(符號)位。所以,它應該是:

struct byte 
{ 
int one:3; 
}; 

或者使用無符號整數。

struct byte 
{ 
unsigned int one:2; 
}; 
+0

感謝您的回覆。也許你可以爲我找一些東西。如果編譯器會忽略未使用的位,爲每個位域指定一個類型的意義何在? – pablorg

+0

您請求了一個分配的位。如果你通過的比這更多,它會忽略額外的信息位。 –

+0

因此,對於位域我使用哪種類型沒有區別? – pablorg