【解析新特性】300W单路输出工业电源>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 大家注意避坑啦!一个关于数据类型转换的C语言陷阱。

共6条 1/1 1 跳转至

大家注意避坑啦!一个关于数据类型转换的C语言陷阱。

助工
2019-09-17 17:26:47    评分

平时写法不规范的时候,编译器都有提醒,今天不知道咋的没有提醒,就进到陷阱了,在此记录一下,也起提醒作用。
下面是抽象出来的代码,按照以下写法,会运行到Failed里面,aa-bb的值打印出来为4,比较纳闷,4>-3怎么还是进到下面的分支了。
如果使用前进行一下类型转换,改成 aa - (int32_t )bb,就会进行到正常分支,之前以为编译器会自动转换。使用minGW和VS运行结果相同。


码例:

    int32_t aa = 5;

    uint32_t bb = 1;

    if ((aa - bb) > -3)

    {

        sprintf ("Passed aa-bb=%d", aa - bb);

    } ///if (aa-bb>-3)

    else

    {

         sprintf ("Failed aa-bb=%d", aa - bb);

    } ///if (aa-bb>-3)





关键词: 避坑               类型转换     C语音    

助工
2019-09-17 21:30:37    评分
2楼

比较时, -3被类型提升成 uint32_t 了?!


助工
2019-09-17 21:34:09    评分
3楼

之前以为编译器会自动转换       

  我们都喜欢犯的自我主义和经验主义


助工
2019-09-17 23:17:43    评分
4楼

有符号与无符号数这样比较,是有问题的。左右值比较类型至少要一致噻,可以这样  (uint32_t)(aa - bb) > -3


工程师
2019-09-17 23:23:08    评分
5楼

其实也简单,有符号和无符号比较,会把有符号先变成无符号,于是-3就变成4294967293了。
下面这个程序也是输出Failed.


#include <stdio.h>


int main(void)

{

    if (4UL > -3) {

        printf("Passed\n");

    }

    else {

        printf("Failed\n");

    }

    return 0;

}



工程师
2019-09-17 23:28:32    评分
6楼

对我之前也遇到过这样的问题


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]