为什么这个程序会输出;“1”吗;? #包括 main() { 无符号整数a=1,b=2; printf(“%d\n”,a-b>=0); getch(); }

为什么这个程序会输出;“1”吗;? #包括 main() { 无符号整数a=1,b=2; printf(“%d\n”,a-b>=0); getch(); },c,C,为什么此程序输出“1”?编译时启用了警告,这将变得非常明显: #include<stdio.h> main() { unsigned int a=1,b=2; printf("%d\n",a-b>=0); getch(); } 您正在减去两个无符号整数。尽管减法等于-1,但由于它们是无符号的,所以它会环绕,得到一些非常大的值。无符号整数不可能不大于或等于零。引用ANSI C 89使用无符号操作数生成负数的减法

为什么此程序输出“1”?

编译时启用了警告,这将变得非常明显:

 #include<stdio.h>  
 main()  
 {  
      unsigned int a=1,b=2;  
      printf("%d\n",a-b>=0);  
      getch();  
 }

您正在减去两个无符号整数。尽管减法等于
-1
,但由于它们是无符号的,所以它会环绕,得到一些非常大的值。无符号整数不可能不大于或等于零。

引用ANSI C 89使用无符号操作数生成负数的减法标准:

涉及无符号操作数的计算永远不会溢出,因为 无法由结果无符号整数表示的结果 类型按比最大值大一的数的模减少 可由结果无符号整数类型表示的值


因此,无符号减法永远不会生成负数,从而使条件为真,从而打印
1

尝试打印逻辑表达式的一部分

unsigned.c:5:22: warning: comparison of unsigned expression >= 0 is always true
      [-Wtautological-compare]
    printf("%d\n",a-b>=0);
                  ~~~^ ~

你会明白为什么
a-b>=0
是真的。

欢迎来到这里。在这里提问时请多加小心。在问题标题中以这种方式放置代码会侮辱眼睛。总结您的代码中存在的问题,首先是您自己的问题,然后将其放在可读的位置,供其他人阅读。可能的重复项
    printf("%u >= %u\n",a-b, 0);