您好,欢迎来到99网。
搜索
您的当前位置:首页补码运算的知识补充

补码运算的知识补充

来源:99网
一、 计算机不区分有符号数和无符号数。

它只按二进制的法则进行运算,计算机存储单元中的数据到底是什么? 这个要分两种情况:

a. 无符号数:直接以对应的二进制表示。

b. 有符号数:补码形式表示,无论是计算还是存取。

比如在内存单元中有一个数据为FEH,那么它到底是表示什么?是254还是-2?没关系,你说是什么就是什么。因为计算机是不会区分这个数是有符号数还是无符号数的。在你写程序的时候,指定这个量是有符号的,FEH就是一个补码,可以计算得它的真值就是-2,如果指定它是无符号的,那么它就是254。不同的形式在程序中便会有不同的体现。要注意的是在计算中不要超出了数值的范围,以免发生错误。

特别提醒:只有有符号数有原码、补码和反码等表达形式 无符号数各位都是数值,无需再编码

二、对于有符号数为什么在计算机中采用补码形式表达

因为有符号数的原码和反码表达按二进制的法则进行运算时,符号位不能与后面的数字位统一进行处理,而补码的符号位和数值位满足上述运算关系,符号位和数字位可以直接统一处理。

三、两个数的补码之和等于两个数之和的补码

下面以定点小数为例,分四种情况来证明。

证明的先决条件是 | x | < 1,| y | <1,|x + y |<1。

(1) x > 0, y > 0 则 x + y >0 由于参加运算的数都为正数,故运算结果也一定为正数。又由于正数的补码与真值有相同的表示形式,所以根据补码定义可得:[ x ]补 + [ y ]补 = x + y = [ x + y ]补 (mod 2) (2) x >0,y <0,则 x + y > 0 或 x + y < 0 由于参加运算的两个数一个为正、一个为负,则相加结果有正、负两种可能。根据补码定义, [ x ]补 = x, [ y ]补 = 2 + y 所以[ x ]补 + [ y ]补 = x + 2 + y = 2 + ( x + y ) 当 x + y > 0 时,2 + (x + y) > 2,进位 2 必丢失,又因为 x + y > 0,所以 [ x ]补 + [ y ]补 = 2 + (x + y) = [ x + y ]补 (mod 2)

当 x + y < 0时,2 + (x + y) < 2,又因为 x + y < 0,所以 [ x ]补 + [ y ]补 = 2 + ( x + y ) = [ x + y ]补 (mod 2)

(3) x < 0,y > 0,则 x + y > 0 或 x + y < 0

这种情况和第 2 种情况一样,把 x 和 y 的位置对调即可得证。

(4) x < 0,y < 0,则 x + y < 0

由于参加运算的数都为负数,故运算结果也一定为负数。根据补码定义可得: [ x ]补 = 2 + x, [ y ]补 = 2 + y

所以 [ x ]补 + [ y ]补 = 2 + x + 2 + y = 2 + ( 2 + x + y )

由于 x + y < 0,其绝对值又小于1,那么( 2 + x + y )一定是小于 2 而大于 1 的数,所以上式等号右边的 2 必然丢掉,又因为 x + y < 0,所以 [ x ]补 + [ y ]补 = 2 + ( x + y ) = [ x + y ]补 (mod 2)

至此我们证明了,在模2意义下,任意两数的补码之和等于该两数之和的补码。这是补码加法的理论基础,其结论也适用于定点整数。

所以:补码的运算,可以将减法转为加法,即第三部分中(2)、(3)的情况(x或y为负时,蓝色字标出部分)

其中:mod 2 的含义取模运算也叫取余运算,是除2取余(如在VB中,用的是mod( )来取余。而在c++,java等语言中都是用%来取余)

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务