这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » C语言无符号数和有符号数比较的问题

共11条 1/2 1 2 跳转至

C语言无符号数和有符号数比较的问题

高工
2013-12-01 15:52:08     打赏

    在复制别人代码的时候没有注意,在for语句中采用了无符号数和有符号数相比较的语句,编译过程中出现了警告,并没有太在意,单击运行,至此就出现了致命的错误,如下图所示:

编译警告:

运行错误:

   此时for语句失去了判断的功效,确切的说是“n>=0”成了“恒成立”,直接进行后面的”n--”了,以至于使得i>8的情况出现。

下面总结一下:

   有符号数与无符号数之间运算问题,这个问题测试是否懂得C语言中的整数自动转换原则。当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型 。因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。

   而对于浮点数来说,浮点数(float,double)实际上都是有符号数, unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了




关键词: C语言     无符号数比较    

高工
2013-12-01 16:02:19     打赏
2楼

关于预处理器标识#error的作用:

格式:#error  error message 

在编译程序时,只要遇到#error就会生成一个编译错误提示消息,并停止编译。

运行结果如下:



院士
2013-12-02 09:15:58     打赏
3楼
这是在给我们上课。

院士
2013-12-02 22:24:04     打赏
4楼

没有明白楼主的意思。

unsigned int 其定义的变量范围为(0 - 好大的一个数)其任何时候都会大于等于0的,编译器的警告也是告诉你,那个for语句的比较是没有意义的,永远也无法满足条件。


高工
2013-12-03 08:58:19     打赏
5楼
就是您这意思,意在表明有符号数和无符号数在进行比较的时候会统一转化为无符号数,这么一来,如果和零比较的话就永远的大于等于零了,嘿嘿嘿

菜鸟
2013-12-03 09:59:19     打赏
6楼

我想应该这样写吧:for(n=8;n>0;n--)


菜鸟
2013-12-03 10:00:14     打赏
7楼

平时我也没注意过。。。


高工
2013-12-03 11:35:13     打赏
8楼
可以一试,我觉得应该可以

高工
2013-12-03 11:36:02     打赏
9楼
是啊,发现通信数据不对,所以才捋了捋

助工
2013-12-18 08:50:45     打赏
10楼

这个问题好像在《C专家编程》里面有描述的,比如

int a=-1;

unsigned int b=3;

if(a < b)

{……}

这个if的判断是无用的,可能原意是要判断-1<3,但此时的a已经整型升级成一个很大的数了,编程中有可能出现类似bug


共11条 1/2 1 2 跳转至

回复

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