我是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
有谁可以解释为什么输出如此?感谢。
答案 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)
您使用了一个位域,但没有考虑到这个符号需要一点代表这一事实,将范围缩小到低于您分配给它们的值。如果要存储该大小的有符号整数,则需要扩大字段的存储空间。