原码,反码,补码和移码

以下都是以有符号数为基础。

原码

实际上,我们把符号数字化或者符号数值化,就已经给出了一种机器数的表现形式,我们把这种方式称为 原码表示法

定义

一共分为整数和小数

  • 整数
    image
    • 第一个表达式,n代表数值上的位数,"0,x"的0表示符号位。x 是真值的数值部分
    • 例子
      • image
  • 小数
    image
    • 例子
      • image

无论是整数的的逗号或者小数点,在计算机中是不需要存储的,这里只是我们为了阅读和理解写的

整个表示起来,也就是,如果是整数,也就是加一个符号位,和一个逗号,如果是小数,也就是加一个符号为和一个小数点(将原来小数点的左边的那位变成符号位)。

补码

用于减法的操作

//实际上,计算机的加法操作和平时的加法操作一样,只是缝二进一
                    无符号数      有符号数
    00001110        14              14
+   10001110        142            -14
________________
    10011100        156             0

这里我们发现,答案是不同的,在有符号数的清空下,但是如果我们这里要是可以这样,把14+(-14)变成14-14

        00001110
-       00001110
__________________
            0

这样就没有问题。但是我们发现,正数加上一个负数等于正数减去一个负数。,要根据符号为判断,很麻烦。但是要怎么把减法统一成加法。
这里举个例子,平时我们的时钟如果走快了,本来是八点,走到了十点,那么怎么进行拨回去?

  • 逆时针拨两个小时 10-2=8
  • 顺时针拨10个小时 10+10=20
    可见,-2 可用 +10 代替 减法 -> 加法
    记作 -2=+10 (mod 12)
    同理 -4=+8 (mod 12)
    时钟以12为模
    这里我们就得到结论

补数

一个负数加上“模“ 即得该负数的补数
一个正数和负数互为补数时,它们绝对值之和为 模 数。

举例

我们假设,寄存器是四位,那么就是模16,一但大于16将会舍去。
1011 -> 0000 ?

  • 第一种
        1011
-       1011
______________
        0000
  • 第二种
        0101
+       1011
______________
        10000

这个时候多出来的 1 ,将会被舍掉,利用时钟的思想,这样的话,寄存器还是存在 0000。
减掉1011和加上0101是等价的,互为补数。这样的减法操作可以用加法替代。
记作 -1011 = +0101 (mod2^4)
这里就提出了补码的概念
对于正数,补码与原码的表示相同。
对于负数,原码符号位不变,数值部分按位取反,末位加1 (取反加1),此规则也同样适用于由补码求原码。

定义

  • 纯整数的补码
    image
    • 例子:
      image
  • 小数的补码
    image
    • 例子 image

反码

作为原码和补码的过渡

对于正数,反码与原码的表示相同。
对于负数,原码符号位不变,数值部分按位取反 ,此规则也同样适用于由反码求原码。
表示范围和原码一样

原补反的相互转换

  • 最高位为符号位,书写用”,“(整数)或”.“(小数)将数值部分和符号位隔开。
  • 对于正数,原码=补码=反码
  • 对于负数,符号位为 1,其数值部分
    • 原码除符号位外每位都取反末位加 1 -> 补码。
    • 原码除符号位外每位都取反 -> 反码

移码

易于比较大小
我们的补码是很难表示真值大小,如以下例子:

十进制          二进制          补码
+21             +10101          0,10101
-21             -10101          1,01011
+31             +11111          0,11111
-31             -11111          1,00001

如果我们直接比较的话,我们看看-21和-31都比+21和+31来得大。直接看数值的话。这个时候我们加上 2^5 次方,如果有进位的话,将舍去进位的,这里涉及到溢出问题。

+10101+100000 = 110101
-10101+100000 = 001011
+11111+100000 = 111111
-11111+100000 = 000001

很明显,上面的就比下面的大了。
这里就给出了移码的概念。
移码就是在真值 X 上加上一个常数(偏置值),通常这个常数去 2^n

定义

[x]移=2^n+x
(我这里理解2^n其实可以理解为科学计数法的10^n)

总结

  • 一个真值,它的补码和移码除了符号位不同,其他都相同。只要对补码的符号位取反就可以得到移码。
  • 移码保留了数的大小顺序,大的数移码也大,小的数移码也小。

那移码怎么找回原码
++比如移码0111 1110的真值++。
减去偏置值1000 0000对应的无符号数真值128得到移码真值 :
126-128=-2
或者:
0111 1110-1000 0000=1111 1110
对应真值-2

原创文章 54 获赞 29 访问量 6441

猜你喜欢

转载自blog.csdn.net/qq_37391214/article/details/101035169