运算溢出判断

[复制链接]
3072|14
 楼主| yhn1973 发表于 2014-10-28 16:41 | 显示全部楼层 |阅读模式
32位有符号整数乘以32位有符号整数,如何快速判断结果超出32位数?用KEIL C51或51的汇编都行
wangch_sh 发表于 2014-10-28 17:18 | 显示全部楼层
你用64位数做积不可以吗?
ayb_ice 发表于 2014-10-28 17:18 | 显示全部楼层
本帖最后由 ayb_ice 于 2014-10-28 17:20 编辑

没有什么快速判断,就是根据计算结果判断
这个完全取决于两个输入数的范围,而这两个数输入范围太大了
如果不能准确的判断输入范围,只能用浮点数了(针对51)

比如如果两个输入都在16位数内,就可以肯定不会溢出
 楼主| yhn1973 发表于 2014-10-28 17:25 | 显示全部楼层
wangch_sh 发表于 2014-10-28 17:18
你用64位数做积不可以吗?

这个用的是C51,不支持64位数,再者用64位数速度也慢了很多。
 楼主| yhn1973 发表于 2014-10-28 17:49 | 显示全部楼层
ayb_ice 发表于 2014-10-28 17:18
没有什么快速判断,就是根据计算结果判断
这个完全取决于两个输入数的范围,而这两个数输入范围太大了
如果 ...

正常是不会溢出的,溢出是意外,给出警示就行,用浮点代价太大了,所花费的时间早就可判断出来了。现在的判断方法是两个数的有效位数之和大于31即为溢出,对每个数要做3个字节的与0比较、1个字节最多8次的移位判断,就是不知道还有没有更快的算法。
ayb_ice 发表于 2014-10-28 19:58 来自手机 | 显示全部楼层
yhn1973 发表于 2014-10-28 17:49
正常是不会溢出的,溢出是意外,给出警示就行,用浮点代价太大了,所花费的时间早就可判断出来了。现在的 ...

恐怕你这个判断算法有问题吧
ayb_ice 发表于 2014-10-28 19:58 来自手机 | 显示全部楼层
哪怕其中一个数为2也可能会溢出
dirtwillfly 发表于 2014-10-28 21:30 | 显示全部楼层
没有太好的办法
dirtwillfly 发表于 2014-10-28 21:43 | 显示全部楼层
或者可以按照十进制数进行快速判断乘积的位数:先把数写成科学记数法,比如24646=2.4646e4,就是x*10^y的形式,然后看两乘积的底数部分x,如果x是两位数,最后位数就是y1+y2+2,如果是一位数,就是y1+y2+1。其中y1和y2分别是两乘积的指数部分。
然后根据这个位数可以判断是不是溢出了。
有符号32位的数值范围在-2147483648到2147483647。当乘积为10位数时,要判断首位数是不是大于2,不大于2没有问题;大于2很可能就溢出了,但这样判断不是十分准确。
 楼主| yhn1973 发表于 2014-10-28 23:11 | 显示全部楼层
ayb_ice 发表于 2014-10-28 19:58
哪怕其中一个数为2也可能会溢出

2的话有效位数为2位,另一个乘数的有效位数不能大于29位,若大于则溢出,若不大于则不溢出
visani 发表于 2014-10-28 23:13 | 显示全部楼层
再移到另外一个数里面
menfiss 发表于 2014-10-29 08:12 来自手机 | 显示全部楼层
定点数很好处理吧?
ayb_ice 发表于 2014-10-29 08:33 | 显示全部楼层
有一个方法应该可以

先将两个数都转换成无符号数,然后分别计算两个数的有效位数,这和小于等于31就没有溢出


比如0x0f0f0000有效位数是28

但其实这一通下来也要花不少时间运算
原野之狼 发表于 2014-10-29 09:10 | 显示全部楼层
用汇编写  查溢出标志   或许能行
laoxu 发表于 2014-10-29 14:46 | 显示全部楼层
原野之狼 发表于 2014-10-29 09:10
用汇编写  查溢出标志   或许能行

用汇编写, 肯定行!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

733

帖子

2

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