补码运算-溢出和自然丢弃

int :-32768——+32767
最高位为符号位:0代表正,1代表负
正数:补码,反码,原码相同
负数:补码是正数取反加一

32767 的编码0111111111111111
取反为1000000000000000
再加1得到-32767的编码:
1000000000000001
-32768比32767还少1:自然就是:
1000000000000000

在原码运算时,首先要把符号与数值分开。例如两数相加,先要判断两数的符号,如果同号,可以做加法,如果异号,实际要做减法,减后的差作为两数之和,和数的符号与绝对值较大的数的符号相同。两数相减也是一样,首先要判断两数符号,然后决定是相加还是相减,还要根据两数的大小与符号决定两数之差的符号。

如果是补码运算则不存在符号与数值分开的问题。在补码运算时,把符号位也看成数值,一起参加运算,而且加法运算就一定是相加,减法运算就一定是相减,因此在计算机中对带符号的数进行加减时,最好使用补码。

补码的运算规则是:X + Y = (X + Y)

在y - x算式中,最高位发生的进(借)位,若运算结果并未超出补码的记数范围,这时的进(借)位被视为自然丢弃。计算机在运算中,这种自然丢弃并不影响结果的正确性。

如果计算结果超过补码所允许的表示范围,则其进位称之为溢出。溢出和自然丢弃是两种不同的概念。判别属于哪一种,则要看计算结果最高位与次高位的进位情况,如果最高位和次高位同时产生进位,即所谓双进位,则这种进位属于允许的自然丢弃。如果只有最高位或者只有次高位产生进位,即只有单进位,则这种进位属于溢出,溢出表示其数值超出计算机字长所能表示的范围,运算结果必然是错误的,因而也是不允许的。(另外还有采用双符号位时的判断方法)

溢出的概念主要是指带符号二进制数进行加减运算时可能产生的一种结果。对于无符号数,最高位不是符号位,不采用溢出这个概念(标准规定没有溢出,也就是说,其溢出后的数值是可以确定的,另外也不会有什么被标记的溢出错误)。

当两个无符号数相减时,不允许用小的数去减大的数,因为小减大它的差一定是负数,无符号数的前提是没有符号,显然也不允许有负数,如果这样做,减的结果也必然是错误的。

转载自补码运算-溢出和自然丢弃

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值