为何这段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
相关产品推荐
相关产品推荐

