二进制码的补码,二进制补码作用大吗,二进制和补码
问一个基本问题。
负数在计算机中是如何表示的?比如8在计算机中表示为二进制1000,
那么-8怎么表示呢?
。很容易认为一个位可以指定为符号位。等于0时表示正数,等于1时表示负数。例如,在8位机器中,每个字节的最高位被指定为符号位。那么,8就是00001000,-8就是10001000。
但是,任何一个《计算机原理》的副本都会告诉你,其实
2的补码
(二进制补码)是用来表示计算机内部的负数的。2的补数是多少?这是一种数值转换方法,分两步完成:
第一步,每个二进制位取相反的值,0变成1,1变成0。例如,00001000的相反值是1110111。
第二步。将上一步获得的值加1。1110111变成了1111000。
所以,00001000的二进制补码是1111000。也就是说,-8在计算机(8位计算机)中用11111000表示。
不知道大家怎么看,我觉得很奇怪。为什么一定要用这么麻烦的方式表达负数?更直观的方式不好吗?
昨天又在一本书上看到这个问题,然后花了一点时间在网上找资料。现在终于彻底明白了。
首先,2的补码的好处要清楚。其实计算机用什么方式表示负数并不重要。只要能保持一一对应,负数可以用任何方式表示。所以,既然可以随意选择,就要选择最方便的方式。
2的补码是最方便的方法。它的方便之处在于所有的加法运算都可以由同一个电路完成。
还是以-8作为例子。
假设有两种表示。一种是直观表象,即10001000;另一种是二进制补码表示法,即11111000。另外哪种表示更方便?
写任意一个公式,16 (-8)=?
6的二进制表示是00010000,所以用直观表示,加法会写成:
0010000+10001000-10011000可以看出,如果按照正常的加法规则,会得到10011000的结果,换算成小数就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数和负数的加法,所以必须制定两套运算规则,一套是正数加正数,一套是正数加负数。从电路角度来说,做加法需要做两种电路。
现在,让我们看看二进制补码表示。
0010000+1111000 - 100001000可以看出,按照正常的加法规则,结果是100001000。注意,这是一个9位二进制数。我们已经假设这是一台8位机,所以最高的第9位是溢出位,会自动丢弃。所以结果变成00001000,十进制转换正好是8,是16 (-8)的正确答案。这说明二进制补码表示法可以将加法规则推广到整个整数集,从而可以用一组电路实现所有整数的加法。
2的补数的本质在回答2的补数为什么能正确实现加法之前,我们先来看看它的本质,也就是那两步的转换方法是怎么来的。
要把一个正数变成对应的负数,其实只要把这个数从0减去就可以了。比如-8其实就是0-8。
8的已知二进制数是00001000,而-8可由下式求出:
0000000-00001000-000000-000000(被减数)小于0000100(被减数),所以不够。请回忆一下小学的算术。如果被减数的一位小于被减数,我们该怎么办?很简单。就问最后一个人借1。
所以,0000000也是借用了上一个人的1,也就是说被减数实际上是10000000,公式改写为:
100000000-00001000-1111000进一步观察表明,1000000=11111111 1,所以上述公式可以一分为二:
111111-00001000-1110111+0000001-1111000 2的补码的两个转换步骤就是这样来的。
为什么正加法适用于二进制补码?其实我们想证明的是X-Y或者X (-Y)可以用X加Y的2的补码来做。
Y ^ 2的补码等于(11111111-Y) 1。所以,x加上y的补数等于:
X (11111111-Y) 1
我们假设这个公式的结果等于Z,即Z=X (11111111-Y) 1。
接下来分两种情况讨论。
第一种情况
:如果x小于y,那么z是负数。这时候我们就用2的补数对z的逆运算,找到它对应的正绝对值,然后在它前面加一个负号。所以,Z=-[11111111-(Z-1)]=-[1111111-(X(11111111-Y)1-1)]=X-Y
第二种情况
:如果X大于Y,说明Z肯定大于11111111,但是我们规定这样,Z=Z-10000000=X(11111111-Y)1-1000000=X-Y这证明了在正常的加法规则下,利用2的补码可以得到正负数相加的正确结果。换句话说,计算机可以通过部署加法电路和补码电路来完成所有整数的加法。
(完)
热 文 推 荐
常用的设计模式汇总:最通俗易懂的讲解,看过的都懂了!
资料分享
java学习笔记、10T资料、100多个java项目分享
欢迎关注您的个人微信官方账号【菜鸟名企之梦】,微信官方账号专注