4

我是 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

谁能解释为什么输出如此?谢谢。

4

2 回答 2

9

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

如果您有一个带符号的字段,它的最高有效位表示负数。这意味着负值总是比正值多一个 - 至少在您使用的实现中,它似乎使用二进制补码表示负数。

如果将 a10放入 4 位的位字段中,则有1010,这是负数 (-6 )。

如果将 a5放入 3 位的位字段中,则有101,这是负数 (-3 )。

如果将 a2放入 2 位的位字段中,则有10,这是负数 (-2 )。

如果将 a1放入 1 位的位域中,则有1,它是负数 ( -1)。

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

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

于 2012-06-17T13:39:32.877 回答
0

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

于 2012-06-17T13:39:21.397 回答