You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段C语言代码的条件判断结果不符合预期?请求解释

问题分析:为什么a+b > c的结果是False?

这是个很经典的有符号数与无符号数混合运算的类型转换陷阱,我帮你一步步拆解明白:

先把你的代码格式化一下方便查看:

int a; 
int c; 
unsigned int b; 
a = b = 10; 
c = -1; 
if(a+b > c) 
    printf("True\n"); 
else 
    printf("False\n");

核心问题出在C语言的常规算术转换规则上:

  • 当有符号数和无符号数进行运算(包括比较操作)时,有符号数会被隐式转换为无符号数类型。
  • 第一步计算a + b:a是有符号int(值为10),b是unsigned int(值为10),所以a会先被转换为unsigned int类型,相加后得到20,结果类型依然是unsigned int。
  • 第二步比较a+b和c:c是有符号int的-1,此时它会被转换为unsigned int类型。由于无符号数没有负数的概念,-1转成unsigned int后,会变成该类型能表示的最大值(比如32位系统下是4294967295)。
  • 现在比较的就是20和4294967295,显然20远小于这个数,所以条件不成立,自然输出False。

如果想得到你预期的结果,需要显式强制转换类型,比如把判断条件改成:

if((int)(a+b) > c)

这样a+b的结果会被转成有符号int,和c比较时就是正常的有符号数运算,20肯定大于-1,就会输出True了。

内容的提问来源于stack exchange,提问作者Tsolakidis Konstantinos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:18:12