[英]C unsigned int + int
为什么此代码显示"greater than 0"
?
int main()
{
unsigned int a = 5;
int b = -10;
(a + b) > 0 ? printf("greater than 0") : printf("less than 0");
}
如果我做:
printf("%d\n", a + b);
...它打印:
-5
每当您在C中执行任何操作时,都会根据“常规算术转换”规则(规范的6.3.1.8节)对参数进行转换。 它们很多,但是出于本示例的目的,重要的是:
整数提升在两个操作数上执行。 然后,将以下规则应用于提升后的操作数:
如果两个操作数具有相同的类型,则无需进一步转换。
否则,如果两个操作数都具有符号整数类型或都具有无符号整数类型,则将具有较小整数转换等级的操作数转换为具有较大等级的操作数的类型。
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则将带符号整数类型的操作数转换为无符号整数类型的操作数的类型。
int
和unsigned int
具有相同的覆盖范围,因此,每当对int
和unsigned int
,该int
都会转换为unsigned
。
在这种情况下,这会使b(-10)的值变得非常大。 然后,向其添加5,它仍然很大(但不足以使回绕为零),因此>
的结果为true。
6.3.1.1布尔值,字符和整数以及6.3.1.8常规算术转换 (感谢Chris)
如果一个int可以表示原始类型的所有值(受位字段的宽度限制),则该值将转换为int; 否则,它将转换为unsigned int。 这些称为整数促销。58)整数促销将所有其他类型保持不变。
和
...如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则将带符号整数类型的操作数转换为无符号整数类型的操作数的类型。
加法涉及一个unsigned
和一个int
, int
不能表示所有unsigned
的值,因此该值将转换为一个unsigned int
。
默认情况下,根据通常的算术转换 ,您的int
被提升为unsigned int
:
[...]如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则带符号整数类型的操作数将转换为无符号整数类型的操作数的类型。
您需要将a
强制转换为int
,以使该三元组按预期工作:
((int)a + b) > 0 ? printf("greater than 0") : printf("less than 0");
在打印语句中,将a和b转换为它们的带符号int表示形式,然后再将它们添加在一起。 您不是有条件的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.