什么是原码、反码、补码?
计算机中,并没有原码和反码。
正负数据,在计算机中,只是以补码存放的。
以八位二进制来说明补码结构。
数字 0,就是以 0000 0000 存放。
数字 1,就是加上 1,得 0000 0001。
其它,继续加,就行了。
数字 127,就是 0111 1111。
------
数字-1,就是 0 减一,即:
0000 0000-1 =(借位 1) 1111 1111。
只保留八位,存放形式就是 1111 1111 (十进制 255)。
数字-2,就再减一,得:1111 1110 (= 254)。
数字-3,就再减一,得:1111 1101 (= 253)。
其它,继续减,即可... ...
数字-128,存放形式就是:1000 0000 (= 128)。
------
以上这些,就是补码。
八位补码可以表示:-128~+127。
计算公式:
负数的补码=【256+该负数】
正数的补码,就是正数本身
(如果需要二进制,你自己再变换。)
------
用补码代替负数,就可以把减法,转换为加法运算。
因此,计算机只要有一个加法器,就够用了。
例如: 7-3 = 4。
用补码的计算过程如下:
7 的补码=0000 0111
-3的补码=1111 1101
--相加-------------
得: (1) 0000 0100 = 4 的补码
舍弃进位,只保留八位作为结果,就是 4。
这就用加法,解决了负数以及减法的问题。
------
原码和反码,并没有这些功能。
所以,在计算机中,并没有原码和反码。
所谓的“取反加一”,由谁算呢?
计算机,可不做这些事。
反码
和补码的目的就是为了解决减法问题,因为计算机CPU的运算器中只有加法器,要把减法转化成加法来计算.
举个例子,A表示十进制数“+16”,B表示十进制数“-19”,把这两个数的原码直接相加,得:
A=+16
(A)原=00010000
B=-19
(B)原=10010011
00010000
+
10010011
————
10100011
其结果符号位为1是负数,其数值位为100011,即等于十进制数“-35”,这显然是错的结果.
再比如,十进制数“+16”与“+19”的原码直接相减,得:
00010000
-
00010011
————
11111101
结果为“-125”,这又是错的.
但是引入补码后,加减法都可以用加法来实现,如“-16+11”的运算:
11110000
+
-16的补码
00001011
11的补码
————
11111011
-5的补码
如果是“-16-11”,那么就转化为加法运算“-16+(-11)”
11110000
+
-16的补码
11110101
-11的补码
————
111100101
-27的补码
在字长为8位的系统中,最高位所产生的进位被自然丢弃,运算结果的机器数为11100101,是-27的补码形式,结果正确.
顺便告诉你一些其它的东西:
1.二进制数中,两数的补码之和等于两数和的补码.
2.补码=反码+1
3.反码=原码除符号位外其它数值取反(即该数的绝对值取反),即“0”变“1”,“1”变“0”.
4.任何正数的原码
反码
补码的形式完全相同(即都是自身,不变)
5.在计算机中,有符号的数都是采用补码来表示的.
6.计算的时候,符号位也参与运算.
2013-10-23
[X+Y]补 = [X]补 + [Y]补
2):补码减法公式
[X-Y]补 = [X]补-[Y]补 = [X]补 + [-Y]补
其中:[-Y]补称为负补,求负补的办法是:对补码的每一位(包括符合位)求反,且未位加1.
在计算机系统中,数值,一律采用补码来表示和存储。
原码和反码,在计算机中,都不存在。
补码,就是一个“代替负数”的正数。
使用了补码之后,计算机中,就没有负数了,同时,也就没有减法运算了。
使用补码的目的,就是:简化硬件。
----------------
补码(正数),怎么就能代替负数呢?
用十进制来说明,比较容易理解。
你看:
25 - 1 = 24
25 + 99 = (一百) 24
你如果舍弃进位,+99 就能代替-1;加法,也就能代替减法。
同样,+98 也可以代替-2。
这些正数,就是“负数的补数”。
公式: 补数 = 负数 + 10^n, n 是补数的位数。
----------------------
计算机用二进制,补数,就叫做补码了。
对于 8 位 2 进制,补码 = 负数 + 2^8 = 负数 + 256。
所以,-1 的补码就是 255 = 1111 1111 (二进制)。
-2 的补码就是 1111 1110。
。。。
正数,不需要变换,必须直接参与运算。
所以,正数,它就没有补码。
----------------------
求 7-2 = 5,用补码计算如下:
+7 = 0000 0111
[-2]补 = 1111 1110
---相加-------------
得: (1) 0000 0101 = +5
舍弃进位,结果,就是非常正确的。
----------------------
补码,就是补码,与原码反码毫无关系。
补码,本来,是很简单的,也很容易理解的。
但是,从“原码反码取反加一。。。”来学习补码,就不容易理解了。
那么,“原码反码。。。”,老师总是讲这些,是想干什么呢?
这些老师脑子不好用,所以才弄出这些骚操作。