2012-10-04 42 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