原码反码补码的阐述

通用计算机概念

冯·诺依曼结构

美籍匈牙利科学家冯·诺依曼提出重要理论:

  • 存储程序计算机结构,以二进制作为计算机的存储基础
  • 计算机主要由运算器、控制器、存储器和输入输出设备组成

运算器

当代计算机中只有加法运算器,没有减法运算器。所以在计算机中,对于减法操作均是按照加法操作进行运算。

a-b = a + (-b)

机器数

机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。

原码

ok,到现在我们就会发现一个问题,二进制只有0和1组成,没有符号,那么负数如何表示就是一个问题。为了解决负数在二进制表示的问题就有了原码的概念。

原码:数字的二进制表现形式,即机器数,用最高位表示符号位,“1” 代表负数,“0”代表正数,其后的为止

我以4位运算来举例(主要是懒的打那么多0)。

原码 十进制正数字 十进制负数字 原码
0000 0 -0 1000
0001 1 -1 1001
0010 2 -2 1010
0011 3 -3 1011
0100 4 -4 1100
0101 5 -5 1101
0110 6 -6 1110
0111 7 -7 1111

首先,我们看到了很奇怪的两个0,一个+0一个-0,这里是不正常的 (不要说+0和-0一样,要记住数学上0是没有符号的,既不是正数也不是负数)。
ok,我们开始进行计算:

2+3 = 0010+0011 = 0101 = 4 正确

那么计算减法,我们之前说过计算机运算器是用加法表示减法,所以减法运算如下:

3-3 = 3 +(-3) = 0011+1011 = 1110=-6(这里我是有疑问的,符号位不参与运算,不知道这里该怎么算)

再计算一下减法与减法相加:

(-2)+(-3) = 1010 + 1011 = 1101 = -5 似乎正确
(-4)+(-5) = 1100 + 1101 = 1001 = -1 ?闹呢
那么
通过上面的运算,我们可以发现,正数相加是没问题的,负数与负数相加,正数与负数相加会产生错误的结果,其实这里的计算也是不对的,因为计算机中规定, 原码相加符号位不参与计算
ok, 我们可以发现,用原码进行加法计算存在问题。那么我们就需要引入另外一个概念:反码。

反码

反码:正数的反码还是其原码,负数的反码是符号位不变,其余位取反。港澳台成为一的补数

那么对应反码原码表格如下:

原码/反码 十进制正数字 十进制负数字 原码 反码
0000 0 -0 1000 1111
0001 1 -1 1001 1110
0010 2 -2 1010 1101
0011 3 -3 1011 1100
0100 4 -4 1100 色度
0101 5 -5 1101 1010
0110 6 -6 1110 1001
0111 7 -7 1111 1000

我们重新计算:

反码运算符号位是参与加法运算的

4+(-4 )= 0100 + 1011 = 1111 = -0 ,似乎正确,不过如我之前所说,-0的存在就是问题。
我们再计算一个:
6 + (-4) = 0110 + 1011 = 0001= 1 错误

再计算负数与负数相加:

(-4)+(-5) = 1011 + 1010 = 0101 = 5 错误.

通过以上计算,我们可以发现,反码似乎能够解决除了产生-0下的正反数相加和为0的问题,但是,对于负数与负数相加、正数与负数相加还是存在问题的。因此,我们就该讨论补码了。

补码

补码:是为了在计算机运算中达到模运算的统一,从原码衍生出来的一种码。

补码的求法:

正数的补码是其本身,负数的补码是其反码+1.

另外一种求法:

负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。

原码、反码、补码的引入本质上是为了解决计算机中减法问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章