请问,什么叫原码反码补码?说简单些
补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。
反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。
2024-12-11 广告
在计算机系统中,正负数值,一律采用补码表示和存储。
原码和反码,计算机,既不使用,也不存储。
讨论原码反码,也就没有任何意义。
------------------------
计算机使用的,是二进制数。
在计算机系统中,字长,是固定的。
八位机,其寄存器、运算器、总线位数,都是 8。
------------------------
数值 0,存在八位机中,就是:0000 0000。
数值 +1,就是:0000 0001。
数值 +2,就是:0000 0010。
。。。 。。。
数值 +127,就是:0111 1111。
可以看出,当十进制数递增时,其二进制数,也是“依次递增”的。
规律就是:0 + X。
------------------------
同理,如果十进制数递减,其二进制数,必然是“依次递减”的。
因此,数值-1,就是:0000 0000-1 = (借位 1) 1111 1111 (255)。
(借位,不在字长 (8) 之内,应该忽略。)
数值-2,就再次减一,得:1111 1110 (254)。
数值-3,就是 0-3,得:1111 1101 (253)。
。。。 。。。
数值-128,就是 0-128,得:1000 0000 (128)。
------------------------
由此可知,-128~-1,存在计算机中,就是:128~255。
前面说过的 0 ~ 127,依然还是: 0 ~ +127。
这一组数据,就是计算机专家所说的:补码。
8 位数的补码,所表示真值的范围就是:-128 ~ +127。
真值,与其补码的换算公式是: [ X ]补码 = 0 + X。
如果真值是正数,当然就是:0+正数;
如果真值是负数,那也就是:0+负数。
------------------------
有了补码,就可以用加法,完成减法运算了。
例如,十进制的减法: 5-4 = 1。
用八位补码计算,竖式如下:
+5 补码: 0000 0101
-4 补码: 1111 1100
--相加--------
( 进位 1 ) 0000 0001
舍弃进位,八位的和,就是+1 的补码。
------------------------
利用补码,可以把减法化为加法运算,可以简化硬件设备。
原码和反码,都没有这种功能。
所以,计算机中,只用补码,不用原码和反码。
讨论原码反码,也就是没有任何意义的事。
利用补码的理论,可将负数,用一个正数来代替。
那么,减法,就可以用加法代替。最终目的,就是节省硬件。
所以,在计算机系统中,数值,一律用补码来表示和存放。
原码反码,都是不存在的。
数值和补码,可以直接互相转换,根本就不需要用原码反码来过渡。
负数的补码,怎么就是个正数呢?
学过三角函数的同学,都知道,函数周期是 2π(360°)。
因此,-90°,就可以用 +270° 来进行运算。
同理,时针,倒拨 5 小时,就可以用正拨(12-5)代替。
用正数,代替负数,必要的条件,就是:周期性。
如果限定,仅使用两位十进制数:0~99,周期就是 100。
-1,就可以用 +99 代替:
25 - 1 = 24
25 + 99 = (一百) 24
只取两位,它们的功能,不就是相同的吗?
99,就是-1 的补数。 计算公式:补数=周期+负数。
---------------------
计算机所做的运算,位数,也是固定的,八位机,就是 8 位。
八位二进制的范围是:0000 0000~1111 1111(十进制 255)。
计数周期就是:2^8 = 256。
-1 的补码,就是 256-1 = 255 = 1111 1111(二进制)。
-2 的补码,就是 256-2 = 254 = 1111 1110(二进制)。
。。。
求负数补码的公式:周期 + 该负数。
(如果需要二进制,你就再转换一下。)
以上,就是“什么叫补码?”的答案。
----------------------
原码反码,都没有计算的功能,计算机中,也不用它们。
“什么叫原码反码?”
不存在的东西,还讨论它们干嘛? 就算了吧。
只是简单的储存,单看数据本身,无法判断一个二进制数有没有符号,是用补码、反码、还是原码,甚至是否代表一个数字。那些都是编程的人为数据赋予的意义。如果有大段程序,可以看出逻辑、算法,也许可以辨别。
一般来说,表达负整数,目前只有用“补码”一个方法。“反码”和“原码”纯属历史,微处理器年代已经不用了。至于改二进制数有没有符号,就要从程序的上下文找线索了。有些指令是分有符号和无符号的,如果出现了,就比较好判断。以
8086
指令集为例:
乘
除
右移
无符号
mul
div
shr
有符号
imul
idiv
sar