二进制中原码,反码和补码是什么?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

请原谅我的不用心的截图,但因为原文章在百度文库中,下载复制是需要开通会员的,所以我就飞快的截起了图 。
附上原文章的地址 https://wenku.baidu.com/view/51cdc9a984254b35effd343e.html


不过,看完上篇后,我对于为什么计算机不使用原码而改用补码还是有惑,所以再次网上查找资料,果然,很快我就有的完美答案 。
下文转自 https://blog.csdn.net/hittata/article/details/9108365

计算机为什么选用二进制补码?

总结如下几点:

1.补码本身具有幂等性:该特性决定我们虽然运算使用补码,但是通过两次补码可以回到原码;
((X)补)补=X
a+b=(a补+b补)补

2.补码解决了正0 负0的二义性,使0的表示得到统一;
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000

3.CPU将加,减法统一为加法运算;
[a-b]补=a补+(-b)补

4.使符号位能与有效值部分一起参加运算,从而简化运算规则。
补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,
可以正常地参与运算。CPU并不知道正负,使其能够按照和无符号数一致的运算规则进行处理;

5.补码使二进制的加、减、移位等操作和十进制具有相同的运算规律;

6.负数-a实际上使用0-a结果,通过二进制运算0-a就是-a的补码,由此可见定义补码就是要求所有算术运算符合现有的运算规律;


补码意义:

所以补码的设计目的是:

⑴ 使符号位能与有效值部分一起参加运算,从而简化运算规则。补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,可以正常地参与运算。

⑵ 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。

所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、c等其他高级语言中使用的都是原码。

CPU对于补码完全不知情,其只按照指令机械的按照电路设计进行工作,并对某些溢出标志位进行设置;
所有的逻辑由编译器来决定,处理的数是有符号数还是无符号数,有符号数出现溢出怎么处理,这些在编译时已经确定;
编译器送给机器的机器代码中:负数已经进行补码编码,同时编译器负数对负数结果进行转换为原码或10进制数据显示给用户;

再加深下印象 ,来个例子
此例子 转自 ,http://www.ruanyifeng.com/blog/2009/08/twos_complement.html

以-8作为例子。

假定有两种表示方法。一种是直觉表示法,即10001000;另一种是2的补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?

随便写一个计算式,16 + (-8) = ?

16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:

00010000
+10001000
---------
 10011000

可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。

现在,再来看2的补码表示法。

00010000
+11111000
---------
100001000

可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,2的补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。


![在这里插入图片描述](https://img-blog.csdn.net/20180917185715970?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RlZF9jcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

猜你喜欢

转载自blog.csdn.net/ted_cs/article/details/82732256