为什么这个程序输出是的,虽然它应该有抛出错误或没有
问题描述:
这里a + b是-14应该小于'a',因此应该打印否,但它打印是的。为什么这个程序输出是的,虽然它应该有抛出错误或没有
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
的值被解释为无符号值。
如果使用正确的转换符%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
为什么您要指定a是无符号整型?你有没有必要这样做? – jmoon