为什么会引入原码,反码,补码?
希望采纳
正负数,在计算机中存放的格式,就是补码。
计算机中,并没有原码和反码,也就不必关心它们了。
下面,针对补码,给出解释。
比如,有一个小孩,很小的。
他只认识 100 个数(0~99),也不会做减法。
那么,就可以告诉他:“减一”,就用“加 99”算吧。
36 - 1 = 35
36 + 99 = (1) 35
忽略进位的 100,结果不是一样的吗?
那么,就是说:
99,就是-1 的补数。
98,就是-2 的补数。
。。。
利用“补数”,就可把“减法”转为“加法”。
利用这个特点,计算机中,仅需一个“加法器”,就够用了。
------------
在计算机中,是以二进制存放各种信息的,统称为:代码。
八位,作为一个计算单位。
范围是:0000 0000 ~ 1111 1111。
写成十进制,就是:0~255。
共有 256 个代码。--这个数字,称为:模。
那么:
1111 1111(255),就是-1 的补码。
1111 1110(254),就是-2 的补码。
。。。
1000 0000(128),就是-128 的补码。
求负数的补码,就是这么简单。
而零和正数,直接参加运算即可,用不着求补码。
因此,下面就是补码的定义式。
零和正数的补码: 就是该数字本身。
负数的补码: 就用“模”,加上该负数。
模,就是代码的总个数。
---------
原码和反码,则毫无意义。
所以,在计算机中,并没有它们的存在。
补码的功能,类似于:
时针,倒拨 3 小时,可以用正拨 9 小时代替。
利用这种思路,计算机中的负数,也可以用正数(即补码)代替。
于是,计算机中,就没有负数了。
同时,减法运算,也都不存在了。
因此,借助于补码,就能统一加减法,从而简化计算机的硬件。
------------------------
用十进制来说明比较容易理解:
25 - 1 = 24
25 + 99 = (一百) 24。
只要忽略进位,仅保留 2 位数,+99 就能代替-1。
同理,+98 也可以代替-2。
。。。
这些正数,就是“负数的补数”。
求补数的算法:补数 = 负数 + 10^2。
通用的公式是:补数 = 负数 + 10^n。
n 是补数的位数。
10^n 是 n 位数的计数周期。
------------------------
计算机用二进制,补数,就改名为:补码。
一个字节,是 8 位 2 进制。
计数范围是:0000 0000~1111 1111 (十进制 255)。
计数周期是:2^8 = 256。
求负数补码的算法:补码 = 负数 + 2^n。
那么:
-1 的补码 = -1 + 256 = 255 = 1111 1111。
-2 的补码 = -2 + 256 = 254 = 1111 1110。
。。。
正数,则必须直接参加运算,不许作任何变换。
因此,正数,它就没有补码。
------------------------
例如,7-2 = 5,用补码计算如下:
7 = 0000 0111
[-2] 补 = 1111 1110
--相加------------
得: (1) 0000 0101 = 5
舍弃进位,结果就完全正确。
------------------------
用补码(正数)替代负数,就能把“减法转换为加法运算”。
原码和反码,都没有这种功能。所以,计算机,并不使用它们。
实际上,原码和反码,它们根本就不存在。
补码的来源,与原码反码也毫无关系。
“原码反码取反加一、符号位也能参加运算”...
这些,都没有什么理论依据。
从“取反加一”来学习补码,就弄不清楚“为什么会引入补码”。