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