这里的a + b是-14,它应该小于'a',因此应该打印NO,但它打印是。
unsigned int a = 6;
int b = -20;
if((a+b) > a){
printf("Yes");
} else {
printf("NO");
}
return 1;
根据 C 标准(6.3.1.8 常用算术转换(
1 许多期望算术类型操作数的运算符导致 以类似的方式进行转化和收益结果类型。目的是 确定操作数和结果的通用实数类型。对于 指定的操作数,转换每个操作数,不更改类型 域,其对应的实数类型为公共实数的类型 类型。除非另有明确说明,否则常见的实数类型也是 结果的相应实际类型,其类型域为 操作数的类型域(如果它们相同且复杂( 否则。这种模式称为通常的算术转换:
。
否则,如果具有无符号整数类型的操作数具有秩 大于或等于其他操作数类型的秩,则 具有有符号整数类型的操作数将转换为 具有无符号整数类型的操作数。
类型unsigned int
和int
具有相同的等级。
因此,示例中b
变量的值被解释为无符号值。
如果要在函数调用printf
中对表达式( a + b )
使用正确的转换说明符%u
,则可能会得到
#include <stdio.h>
int main(void)
{
unsigned int a = 6;
int b = -20;
printf( "a + b = %un", a + b );
return 0;
}
a + b = 4294967282
您将已签名与无符号进行比较。由于无符号的所有值都无法容纳在有符号中,因此有符号值将转换为无符号并且远大于 6