C中结构的详细信息

时间:2012-06-17 13:33:31

标签: c structure

我是C的新手。我在googled很多关于下面代码的输出。但没有太大的帮助。

以下是代码:

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

有谁可以解释为什么输出如此?感谢。

2 个答案:

答案 0 :(得分: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;
};

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

答案 1 :(得分:0)

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