一个关于数据类型转换的C语言陷阱,大家注意一下

2019-12-09 19:20发布

平时写法不规范的时候,编译器都有提醒,今天不知道咋的没有提醒,就进到陷阱了,在此记录一下,也起提醒作用。
下面是抽象出来的代码,按照以下写法,会运行到Failed里面,aa-bb的值打印出来为4,比较纳闷,4>-3怎么还是进到下面的分支了。
如果使用前进行一下类型转换,改成 aa - (int32_t )bb,就会进行到正常分支,之前以为编译器会自动转换。使用minGW和VS运行结果相同
  1.     int32_t aa = 5;
  2.     uint32_t bb = 1;
  3.     if ((aa - bb) > -3)
  4.     {
  5.         sprintf ("Passed aa-bb=%d", aa - bb);
  6.     } ///if (aa-bb>-3)
  7.     else
  8.     {
  9.          sprintf ("Failed aa-bb=%d", aa - bb);
  10.     }///if (aa-bb>-3)
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
墨非
1楼-- · 2019-12-09 19:35
比较时 -3被类型提升成 uint32_t 了
lb0857
2楼-- · 2019-12-09 22:43
之前以为编译器会自动转换             我们都喜欢犯的自我主义和经验主义
ArthurBruin
3楼-- · 2019-12-10 01:36
有符号与无符号数这样比较,是有问题的。左右值比较类型至少要一致噻,可以这样  (uint32_t)(aa - bb) > -3
tomzbj
4楼-- · 2019-12-10 06:46
其实也简单,有符号和无符号比较,会把有符号先变成无符号,于是-3就变成4294967293了。
下面这个程序也是输出Failed.

ps. 乡党,周至还是户县的?
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     if (4UL > -3) {
  5.         printf("Passed ");
  6.     }
  7.     else {
  8.         printf("Failed ");
  9.     }
  10.     return 0;
  11. }
复制代码
了无
5楼-- · 2019-12-10 11:09
 精彩回答 2  元偷偷看……
了无
6楼-- · 2019-12-10 16:40
tomzbj 发表于 2019-9-16 23:04
其实也简单,有符号和无符号比较,会把有符号先变成无符号,于是-3就变成4294967293了。
下面这个程序也是 ...

我之前以为会先自动转换成有符号的再比较,今天入了这个坑也就记下了

一周热门 更多>