📜  C 程序的输出 | 25套

📅  最后修改于: 2022-05-13 01:56:11.001000             🧑  作者: Mango

C 程序的输出 | 25套

预测以下 C 程序的输出。

int main(void)
{
    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);
  
    getchar();
    return 0;
}

上面的代码是不可移植的,输出依赖于编译器。我们使用英特尔 32 位机器的 GCC 编译器获得以下输出。

[narendra@ubuntu]$ ./structure
  i: -1
  j: -2
  k: -3
  l: -6

让我们仔细看看结构的声明。

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

在结构体声明中,对于结构体成员'i',我们使用位域的宽度为1,'j'的宽度为2,依此类推。乍一看,我们可以将值存储在范围 [0-1] 中用于 'i',范围 [0-3] 中用于 'j',依此类推。但是在上面的声明中,位域的类型是整数(有符号)。这就是为什么在可用位中,1 位用于存储符号信息。所以对于 'i',我们可以存储的值是 0 或 -1(对于使用二进制补码来存储有符号整数的机器)。对于变量“k”,位数为 3。在这 3 位中,2 位用于存储数据,1 位用于存储符号。

让我们使用将结构成员声明为“unsigned int”并检查输出。

int main(void)
{
    struct str
    {
        unsigned int i: 1;
        unsigned int j: 2;
        unsigned int k: 3;
        unsigned 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);
  
    getchar();
    return 0;
}

输出:

[narendra@ubuntu]$ ./structure
  i: 1
  j: 2
  k: 5
  l: 10