好像发现一个mdk的bug,大侠救助啊!

[复制链接]
3231|11
 楼主| wwwq 发表于 2011-11-12 17:13 | 显示全部楼层 |阅读模式
BUG, MDK, rc, dc, se
程序:
signed    char c1=-126;
    signed char c2=-3;
c2=c1+c2;
    if (c2>0)
       c1=88;
       else
       c1=77;
c2应该是负数,但是在mdk中c2=7F,是大于0的,因此c1成了88.明显不对啊?哪位大侠说一说。
auzxj 发表于 2011-11-12 17:32 | 显示全部楼层
本帖最后由 auzxj 于 2011-11-12 17:36 编辑

-126+-3=-129
对于signed 数据范围为:-128~127
-129是溢出的 你在编译的时候应该有警告
-129的十六进制表示是0xFF7F,把他强制赋给一个signed char数据,就取底位7F
 楼主| wwwq 发表于 2011-11-12 20:13 | 显示全部楼层
这里有个问题,就是mdk应该有个内部的控制办法,不能全交给用户啊
李富贵 发表于 2011-11-12 20:39 | 显示全部楼层
C语言的魅力就在于把这个白痴型错误的控制权交给用户。

评论

这句话倒是很有道理,嚯嚯!  发表于 2013-2-7 15:36
 楼主| wwwq 发表于 2011-11-12 20:49 | 显示全部楼层
唉,好像也没有别的什么办法了,多仿真几次了
LDTEST 发表于 2011-11-12 21:06 | 显示全部楼层
C语言的魅力就在于把这个白痴型错误的控制权交给用户。
李富贵 发表于 2011-11-12 20:39

精彩!
auzxj 发表于 2011-11-12 22:07 | 显示全部楼层
自己C语言没学好还怪C语言本身。。。。
mdk的内部的控制办法就是给你输出警告,你自己不看,还怪编译器。。。
仿真一万次有毛用,原理都给你说了。。。
你把c2的数据类型定义为unsigned int 就行了。。。。
linqing171 发表于 2011-11-13 07:53 | 显示全部楼层
溢出了,如果用C#,会提示溢出的。如果用Delphi等上个世纪末的语言,在编译器选项里面也可以设置的,前提是CPU有溢出例外(Exception)。

如果用C语言的话,建议用float类型,一般几百几万的加减运算都不会溢出。如果实在不想用浮点库,还是用long long吧。
 楼主| wwwq 发表于 2011-11-13 08:15 | 显示全部楼层
为了节约ram,不得已采用char啊
zhang@long 发表于 2011-11-13 12:46 | 显示全部楼层
hkjc007 发表于 2011-11-13 15:42 | 显示全部楼层
:victory: 1# wwwq
auzxj 发表于 2011-11-13 22:08 | 显示全部楼层
溢出了,如果用C#,会提示溢出的。如果用Delphi等上个世纪末的语言,在编译器选项里面也可以设置的,前提是CPU有溢出例外(Exception)。

如果用C语言的话,建议用float类型,一般几百几万的加减运算都不会溢出。如 ...
linqing171 发表于 2011-11-13 07:53


一看你就不是搞单片的。。。在PC上编程很爽吧。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

118

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部