为什么这个程序输出是的,虽然它应该有抛出错误或没有

问题描述:

这里a + b是-14应该小于'a',因此应该打印否,但它打印是的。为什么这个程序输出是的,虽然它应该有抛出错误或没有

unsigned int a = 6; 
int b = -20; 

if((a+b) > a){ 
    printf("Yes"); 
} else { 
    printf("NO"); 
} 

return 1; 
+0

为什么您要指定a是无符号整型?你有没有必要这样做? – jmoon

按照C标准(6.3.1.8通常的算术转换)

1许多运营商意想不到的算术类型原因操作数 的转化率和产率结果类型以类似的方式。目的是为 确定操作数和结果的常见实型。对于 指定的操作数,每个操作数在不更改类型 域的情况下都转换为对应的实型为公共实型 类型的类型。除非另有明确说明,否则公共实数类型也是 结果的相应实型,其类型域是操作数的 类型域(如果它们相同),否则复杂 。这种模式被称为通常的算术转换

...

否则,如果具有无符号整数类型的操作数秩 大于或等于另一个操作数的类型的秩,然后 带符号整数类型的操作数被转换为具有无符号整数类型的 操作数的类型。

类型unsigned intint具有相同的等级。

因此,您示例中变量b的值被解释为无符号值。

如果使用正确的转换符%u在的printf函数调用表达(a + b),那么你可能会得到

#include <stdio.h> 

int main(void) 
{ 
    unsigned int a = 6; 
    int b = -20; 

    printf("a + b = %u\n", a + b); 

    return 0; 
} 


a + b = 4294967282 
+0

对于unsigned int很好 –

你比较无符号签署。由于无符号的所有值都不能在符号中容纳,所以有符号值将转换为无符号,并且远大于6