原码,反码和补码

来源:互联网 发布:linux 打开防火墙端口 编辑:程序博客网 时间:2024/06/04 18:34

参考了网上的一些资料,忘了地址了

原码,反码,补码

一.机器数和真值

1.机器数

一个数在计算机中的二进制表示叫做机器数。机器数是带符号的,最高位表示符号,0是正,1是负。

例如十进制的2转换成二进制是00000010,如果是-2,就是10000010.

这里的0000001010000010就是机器数。

2.真值

因为第一位是符号位,所以正常转换得出的值句不是真正的数值。例如-2的表示10000010的十进制表示130,但是由于第一位是符号位,相当于-0000010,所以它真正的值是-3.

二.原码反码补码的定义和计算方法

1.原码

原码就是符号位加上真值的绝对值,第一位表示符号位,其余位标示值。

例如:

10000001的值为-1, 00000001的值为1

原码是很容易理解的。

2.反码

反码的表示方法是:

正数的反码是其本身,负数的反码是符号位不变其余各位取反

例如:00000001的反码是00000001

  10000001的反码是11111110

反码看起来就太直观了,我们需要通过计算才能知道到底真值是多少。

3.补码

补码的表示方法:

正数的补码是其本身,负数的补码是符号位不变,其余各位取反加1

例如:00000001的补码是00000001

      10000001的补码是11111111

三.为何要使用原码,反码和补码

可以看出,原码是非常容易辨识的,既然如此,又为何要提出反码和补码呢?

首先为了使得硬件电路设计简单,我们只设计了加法,因为如果要来辨别符号位,硬件电路的设计将会变得复杂。于是就让符合位也参与到计算中去。

首先假如用原码来表示,可以看一下计算的结果:

1+-1= 00000001+10000001 = 10000010 = -2,结果显然不对。

如果使用反码来计算:

1+-1) = 00000001 + 11111110 = 11111111 = (原码)10000000 = -0

这个也是有问题,-0会让我们很困惑。

使用补码就可以解决这一问题:

1+-1=00000001+11111111=00000000=0,这个就是正确的值了

另外还有一点,原码,反码因为最高位是字符位,所以可以表示的范围是-127127

但是使用补码却可以多表示一位,

(-1)+(-127) = -128 = 11111111+10000001 = 10000000

这里实际使用以前-0的值来表示-128,所以-128并没有原码和反码表示。

因为机器使用补码,所以32int的范围是 [-231, 231-1] 因为第一位用作符号位,而使用补码表示又可以多存储一位。


0 0
原创粉丝点击