2012-06-17 78 views
4

我是C新手。我对以下代码的输出进行了搜索。但没有太多帮助。C中结构的详细信息

下面是代码:

struct str 
{ 
    int i: 1; 
    int j: 2; 
    int k: 3; 
    int l: 4; 
}; 

struct str s; 

s.i = 1; 
s.j = 2; 
s.k = 5; 
s.l = 10; 

printf(" i: %d \n j: %d \n k: %d \n l: %d \n", s.i, s.j, s.k, s.l); 
Output: 
i: -1 
j: -2 
k: -3 
l: -6 

任何人都可以解释为什么输出是这样的吗?谢谢。

回答

9

因为您的字段不是unsigned,因此它们被签名。

如果您有一个有符号字段,其最重要的位表示否定性。这意味着总是有一个负值比正值 - 至少在你使用的实现中,似乎使用二进制补码来表示负值。

如果您将10置于4位的位字段中,则您有1010,这是负数(-6)。

如果你把一个5放在一个3位的位域中,你有101,这是负数(-3)。

如果您将2置于2位的位字段中,则表示10为负数(-2)。

如果您将1置于1位的位字段中,则您有1,这是负值(-1)。

随着

struct str 
{ 
    unsigned int i: 1; 
    unsigned int j: 2; 
    unsigned int k: 3; 
    unsigned int l: 4; 
}; 

你应该能够实现你想要的。

0

您已经使用了位域,但没有考虑到符号需要一点代表的事实,将范围缩小到您分配给它们的值以下。如果要存储该大小的带符号整数,则需要放大字段的存储空间。