这里a + b是-14,它应该小于'a',因此应该打印NO但打印是。
unsigned int a = 6;
int b = -20;
if((a+b) > a){
printf("Yes");
} else {
printf("NO");
}
return 1;
答案 0 :(得分:2)
根据C标准(6.3.1.8常规算术转换)
1许多期望算术类操作数的运算符会导致 以类似的方式转换和生成结果类型。目的是为了 确定操作数和结果的通用实数类型。为了 指定的操作数,每个操作数都被转换,不改变类型 域,对应的实际类型是普通实数的类型 类型。除非另有明确说明,否则常见的实际类型也是如此 结果的相应实际类型,其类型域为 操作数的类型域,如果它们是相同的,并且是复杂的 除此以外。此模式称为通常的算术转换:
...
否则,如果具有无符号整数类型的操作数具有等级 那么,大于或等于另一个操作数的类型的等级 带有符号整数类型的操作数转换为 具有无符号整数类型的操作数。
类型unsigned int
和int
具有相同的排名。
因此,示例中变量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