其他分享
首页 > 其他分享> > 原码,反码,补码计算

原码,反码,补码计算

作者:互联网

java中原码,反码,补码相关知识

对于正数:

反码、补码都与原码一样。


对于负数:

反码:原码中除去符号位,其他的数值位按位取反,即0变1,1变0
补码:反码+1
示例:

 

40:

原码:00101000
反码:00101000
补码:00101000
-30

原码:10011110
反码:11100001
补码:11100010

  

 

 

通过实例,可以看到,对于正数,其原码、反码、补码相同。对于负数,原码中最高位用来表示符号,反码就是除了最高位外,其余位取反,补码就是反码+1

上面介绍了原码、反码和补码三者的概念,那么,计算机中为什么要设计补码这一概念呢?因为直接用原码涉及到减法操作,这就增加了计算机底层电路涉及的复杂性。而用补码操作时,当减去一个数时,可以看做加上一个负数,然后转变位加上这个负数的补码。即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.

而使用补码的好处还有,在计算中可以直接带上符号位进行计算。

比如计算40-13:其中 40 的补码为:0010 1000,-13的补码为:1111 0011

因此实际的运算过程就可以直接带符号位进行相加,同时,如果最高位(符号位)有进位,则舍弃。
0010 1000 + 1111 0011 = 1 0001 1011
这里最高符号位的进位可以舍弃,因为8位2进制,能表示的数在-128~127之间。而1 0001 1011 = 283,将283转化到这个范围中即为:
283 % 256 = 27。
其实也相当于 0001 1011. 所以符号位的最高进位可以舍去。

 

通过计算机存储的发展历程也可看出补码的优势。

 

在计算机中,利用补码的方式进行运算,就可以解决直接用原码来计算得到的结果是错误的问题,也解决了减法的问题。而根据所给的负数去得到它对应的补码的过程,就是找到一个正数来代替其负数的过程。

如果用原码表示,让符号位也参与计算,对于减法来说,结果是不正确的。这也是计算机内部在存储数据时不使用原码的原因,为了解决这一问题,出现了反码。

通过计算我们发现用反码计算减法,结果的真值部分是正确的。而唯一的问题出现在"0"这个特殊的数值上,虽然人们理解上**+0和-0**是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。为了解决这一问题,出现了补码。

因为补码能多存储一个-128,而且在计算机底层中存储的是补码,所以在计算机中一个8位的二进制数的存储范围是用补码表示的[-128,127],而不是用原码或反码表示的[-127,127]。这也可以解释为什么计算机中一个字节的取值范围是[-128,127]。

总结来说,原码、反码、补码的使用,是人们为了让符号位能参与运算并让计算机底层运算更加简单而设计出来的数据存储表示方式。

 

标签:反码,计算机,符号,补码,127,原码
来源: https://www.cnblogs.com/ashuai123/p/16684878.html