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

时间:2017-08-14 23:52:23

标签: c types integer type-conversion implicit-conversion

这里a + b是-14,它应该小于'a',因此应该打印NO但打印是。

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

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

return 1;

2 个答案:

答案 0 :(得分:2)

根据C标准(6.3.1.8常规算术转换)

  

1许多期望算术类操作数的运算符会导致   以类似的方式转换和生成结果类型。目的是为了   确定操作数和结果的通用实数类型。为了   指定的操作数,每个操作数都被转换,不改变类型   域,对应的实际类型是普通实数的类型   类型。除非另有明确说明,否则常见的实际类型也是如此   结果的相应实际类型,其类型域为   操作数的类型域,如果它们是相同的,并且是复杂的   除此以外。此模式称为通常的算术转换

     

...

     

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

类型unsigned intint具有相同的排名。

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

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

#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

答案 1 :(得分:0)

您使用unsigned进行比较。由于无符号的所有值都无法在签名中容纳,因此有符号值将转换为无符号值并远大于6