http://blog.csdn.net/bbirdsky/article/details/8962538
原码:1,001101
=>负数
=>反码:1,110010(除符号位以外,各位取反)
=>补码:1,110011(反码加一)
=>移码:0,110011(对补码符号位取反)
注意点:1,首先判断原码的正负,因为对于正数,其原码、补码反码表示形式相同(符号位为0,数值部分与真值相同)
概念介绍:
计算机中的信息都是以二进制形式表示的,数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负)。这就是机器数的原码了。设机器能处理的位数为8。即字长为1byte,原码能表示数值的范围为(-127~-0 + 0~127)共256个。
有了数值的表示方法就可以对数进行算术运算。但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下(假设字长为8bits):
例如: 1-2=-1
十进制\二进制 | 原码 | 反码 | 补码 |
1 | 0,0000001 | 0,0000001 | 0,0000001 |
-2 | 1,0000010 | 1,1111101 | 1,1111110 |
-1 | 1,0000001 | 1,1111110 | 1,1111111 |
目标是:
⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
进一步简化计算机中运算器的线路设计,所有减法转化成加法来运算
十进制: 1-2=1+(-2)
二进制:
原码: 0,0000001+1,0000010=1,0000011 (结果为-3的原码,错了)
0,0000001
+ 1,0000010
--------------------
1,0000011
原码对于人是挺好理解的,对计算机,就不是那么回事了。
就说加法,如果是两个数符号相同,那我可以不管符号,如果两个数符号不同呢,先要判断哪个数绝对值大,然后用大的减去小的,再加上大的的符号。很复杂。问题出在符号上,于是人们就想到要是能找到一个正数代替这个复数,使得最后答案不变,这样不就可以只用加法了吗?
别说,还真就找着了,就是反码
反码 :0,1111110+1,1111101=1,1111110(结果是-1的反码,是正确的)
0,0000001
+ 1,1111101
---------------------
1,1111110
定义0的原码反码和补码时,要注意计算机辨认这里的0需要分正0和负0,所以
(8位表示)原码:00000000 反码:00000000 补码:00000000
10000000 11111111 00000000
+0的补码就是其原码,也就是说是0000 0000而已(对于8位来说)
-0的补码是其反码加1,其反码是1111 1111,当然,其反码加1后就是溢出一个进位后,仍然是0000 0000.
问题出现在+0和-0上,在人们的计算概念中零是没有正负之分的。于是就引入了补码概念。 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的。
补码:1,1111110+1,1111110=1,1111111 (结果是-1的补码,是正确的)
0,0000001
+ 1,1111110
----------------
1,1111111
所以补码的表示范围为:(-128~0~127)共256个。
关于-128的补码,请看下面链接