#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
。#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
。基本上,在您的示例代码中,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数的类型的等级,则带有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。
unsigned int
和int
具有相同的等级,因此它等效于:(a + (unsigned int)b > 6)
需要进行显式类型转换,例如:
((int)a + b > 6)
int main()
{
unsigned int a = 0;
int b=-20;
printf("(a + b) = %f", (a + b));
return 0;
}
不要混合使用有符号和无符号整数,因为编译器会在你不希望的时候进行静默转换。
答案可以在C99标准的“6.3.1.8通常算术转换”一节中找到,该节在二元运算符传递有符号类型和无符号类型时更倾向于无符号类型(实际情况比这复杂得多)。
请参阅此博客文章,了解在6.3.1.8规则中工作的另一个示例。
?:
条件调用函数被认为是不良实践。 - Oliver Charlesworth