struct A
{
int a:2;
int b:3;
int c:3;
};
int main()
{
struct A p = {2,6,1};
printf("\n%d\n%d\n%d\n",p.a,p.b,p.c);
return 0;
}
输出结果为:-2,-2,1。
在C编译器和C++编译器中,上述代码的输出结果是什么?为什么?
struct A
{
int a:2;
int b:3;
int c:3;
};
int main()
{
struct A p = {2,6,1};
printf("\n%d\n%d\n%d\n",p.a,p.b,p.c);
return 0;
}
输出结果为:-2,-2,1。
在C编译器和C++编译器中,上述代码的输出结果是什么?为什么?
#include <stdio.h>
#include <stdint.h>
int main(void)
{
int32_t a = 4294967294;
printf("%d\n", a);
return 0;
}
输出结果为-2
。用一个过大的数字初始化有符号变量会导致其被解释成不同的值。根据规范:
否则,新类型是有符号的,而该值无法在其中表示;结果要么是实现定义的,要么是引发实现定义的信号。
现在让我们看看到底发生了什么。让我们从给定的代码开始:
struct A
{
int a:3;
};
int main()
{
struct A p = {5};
printf("%d",p.a);
}
在3位中,由于这3位设置的符号位是1,因此值为101(5),因此我们需要找到101的二进制补码,即011(3)。 因此,应用上述逻辑,我们的输出将为-3。其他类似地可证明。
例如,对于1001(9),由于a:3,我们将采取3位数值,因此它将是001(1)。由于这里符号位未设置,即为1,因此不需要使用2的补码。答案直接为1。 其他情况类似。
unsigned
。 - Nate