0%

原码,反码,补码和移码

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

原码

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

定义

一共分为整数和小数

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

无论是整数的的逗号或者小数点,在计算机中是不需要存储的,这里只是我们为了阅读和理解写的
整个表示起来,也就是,如果是整数,也就是加一个符号位,和一个逗号,如果是小数,也就是加一个符号为和一个小数点(将原来小数点的左边的那位变成符号位)。

补码

用于减法的操作

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

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

1
2
3
4
        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 ?

  • 第一种

    1
    2
    3
    4
            1011
    - 1011
    ______________
    0000
  • 第二种

    1
    2
    3
    4
            0101
    + 1011
    ______________
    10000

这个时候多出来的 1 ,将会被舍掉,利用时钟的思想,这样的话,寄存器还是存在 0000。
减掉1011和加上0101是等价的,互为补数。这样的减法操作可以用加法替代。
记作 -1011 = +0101 (mod2^4)

这里就提出了补码的概念
对于正数,补码与原码的表示相同。
对于负数,原码符号位不变,数值部分按位取反,末位加1 (取反加1),此规则也同样适用于由补码求原码。

定义

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

反码

作为原码和补码的过渡

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

原补反的相互转换

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

移码

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

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

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

1
2
3
4
+10101+100000 = 110101
-10101+100000 = 001011
+11111+100000 = 111111
-11111+100000 = 000001

很明显,上面的就比下面的大了。
这里就给出了移码的概念。

移码就是在真值 X 上加上一个常数(偏置值),通常这个常数去 2^n

定义

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

总结

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

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

本文标题:原码,反码,补码和移码

文章作者:志者

发布时间:2019年09月19日 - 15:50:00

最后更新:2019年09月19日 - 23:14:34

原始链接:http://witman1999.github.io/原码,反码,补码.html

许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
copy