#include<stdio.h>
main()
{
unsigned int a=1,b=2;
printf("%d\n",a-b>=0);
getch();
}
为什么这个程序输出“1”?
答案 0 :(得分:3)
在启用警告的情况下编译,这将变得非常明显:
unsigned.c:5:22: warning: comparison of unsigned expression >= 0 is always true
[-Wtautological-compare]
printf("%d\n",a-b>=0);
~~~^ ~
您正在减去两个无符号整数。即使减法等于-1
,因为它们是无符号的,它会包裹并且你得到一些非常大的值。无符号整数不可能不大于或等于零。
答案 1 :(得分:1)
引用ANSI C 89
减法标准,使用无符号操作数生成负数:
涉及无符号操作数的计算永远不会溢出,因为 结果无法由结果无符号整数表示 type是以大于最大值的数量减少的模数 可由结果无符号整数类型
表示的值
因此,无符号减法从不生成负数,使您的条件成立,从而打印1
。
答案 2 :(得分:0)
尝试打印部分逻辑表达式
printf("%u >= %u\n",a-b, 0);
您将看到为什么a-b>=0
为真。