#include<stdio.h>
int main()
{
unsigned int a=6;
int b=-20;
(a+b>6)?puts(">6"):puts("<=6");
return 0;
}
以上代码输出>6
。但我怀疑了。 b=-20
将保留负值(-18
)
在做2的补码后,因为它是有符号整数。所以它应该输出<=6
但是它
输出为>6
。
答案 0 :(得分:9)
根据C99标准,第6.3.1.8节(“常用算术转换”):
如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 带符号整数类型转换为操作数的类型 无符号整数类型。
基本上,对于示例代码,unsigned int
和int
具有相同的排名,因此它等同于:
(a + (unsigned int)b > 6)
要修复它,你需要明确地转向另一个方向,即:
((int)a + b > 6)
答案 1 :(得分:1)
答案可以在C99标准的“6.3.1.8常用算术转换”一节中找到,当有符号类型和无符号类型被传递给二元运算符时,它有利于无符号类型(现实更为微妙)比那个)。
有关完成6.3.1.8中规则的另一个示例,请参阅this blog post。
答案 2 :(得分:1)
您在代码中混合了有符号和无符号整数。这是一个坏事。请尝试以下代码段:
int main()
{
unsigned int a = 0;
int b=-20;
printf("(a + b) = %f", (a + b));
return 0;
}
不要混合有符号和无符号整数,因为编译器会在你不想要的时候进行静默转换。