C中结构的详细信息

vij*_*jay 4 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
Run Code Online (Sandbox Code Playgroud)

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

glg*_*lgl 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;
};
Run Code Online (Sandbox Code Playgroud)

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