计算机数据溢出怎么解决方法,计算机溢出问题(1)

大多数机器对整数使用补码编码,而对浮点数使用IEEE标准754编码。在位级上理解这些编码,且理解其算术运算的数学优缺点,对正确使用编程语言避免漏洞来说,非常重要。

1、整数运算

(1). 无符号加法

针对w位无符号数:

573323185ff8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

溢出判断:

573323185ff8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(2). 补码加法(有符号加法)

针对w位补码:

573323185ff8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

溢出判断:

573323185ff8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(3). 无符号乘法:

573323185ff8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(4). 补码乘法(有符号乘法):先做无符号乘法,再把无符号数转为补码

573323185ff8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(5). 乘2的幂次

无符号数与有符号数一致左移位操作,再做截断操作

(6). 除2的幂次

无符号数除2的幂次 = 无符号数右移位 + 向下舍入 + 截断操作

有符号数除2的幂次,如果也按无符号数采取右移位,存在舍入问题。因为被除数为负数时,向下舍入并不合理,例如:-171.25=-172,需向上舍入,例如-171.25 = -171。 采用加偏置进行向上舍入,即x/y向上舍入=(x+y-1)/y向下舍入,即[(x+(1<>k],再做截断操作。

整数运算小结:

表示数字的有限字长限制了可能的值的取值范围,运算结果可能溢出。整数运算均满足交换律、结合律、分配律。补码表示提供了一种既能表示正数也能表示负数的方法,同时使用了与执行无符号相同的位级实现,针对算术运算,无论无符号数还是有符号数表示形式,都有完全一样或者相似的位级行为。

2、浮点数运算

(1). 浮点数表示:S:符号,M:尾数,E:阶码

573323185ff8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

573323185ff8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

浮点数编码分为三种类型:(1)、规格化的值;(2)、非规格化的值;(3)、特殊的值;

(1). 规格化的值

条件:exp即不全为0,也不全为1时:

M = 1(隐式默认值) + Frac(51:0)

E = exp - [(2<

规格化的值的数量为:[(2<

(2). 非规格化的值

条件:exp全为0时:

M = Frac(51:0)

E = - [(2<

E != 1-[(2<

(3). 特殊的值

条件exp全为1时:

小数域Frac(51:0)全为0时,V代表无穷大;Frac(51:0)为非0时,V为NaN代表“不是一个数”

由于有限的位数限制,浮点数数量为[(2<

(2). 浮点运算

* 浮点运算满足交换律,不满足结合律、分配律。

* 浮点加法满足单调性,乘法满足条件单调性。

* 浮点运算缺乏结合律、分配律可能会存在很严重的问题。

* 将大的浮点数转换成整数是一种很常见的程序错误来源。

* 当浮点数非常接近0.0,从而转换成零时,也会下溢。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值