二进制补码
请原谅我的不用心的截图,但因为原文章在百度文库中,下载复制是需要开通会员的,所以我就飞快的截起了图 。
附上原文章的地址 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)
相关阅读
作者:戴翔电子邮箱:[email protected]简介:中华人民共和国公民,中国共青团员,CSDN博客专家,秦淮区疾控中心托管社会公益组织指南针
首先我们来了解下补码的定义,在很多资料上说补码都是从原码说起,但实质上补码是有其定义的:补码定义:计算机中二进制形式的补数。这个
一、什么是格雷码?格雷码,又叫循环二进制码或反射二进制码,格雷码是我们在工程中常会遇到的一种编码方式,它的基本的特点就是任意两个
/*最近在重新学习一遍C语言,以更加深入的理解C语言,为C++打下比较坚实的基础。此次学习主要依据的书籍依然为《C Primer plus》中文
注册表字符串值、二进制值、DWORD值是什么意思?刚编辑的上一篇关于注册表的内容中,竟然把这些内容忘掉了,实在是不该。好在现在想起