我是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
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么输出如此?谢谢.
因为您的字段不是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;
};
Run Code Online (Sandbox Code Playgroud)
你应该能够实现你想要的.