电子说
一个数在计算中的二进制表示形式,叫做这个数的机器数,机器数是带符号的,正数为0,负数为1。
如 :
真正数学意义上的数值。因为第一位是符号位,所以机器数形式值就不等于真正的数值。 如:
00000000000000000000000000000011->+3
11111111111111111111111111111101->-3
当然前面的举例是针对有符号数来说的,对于无符号数,机器数和真值是一致的。
用一个函数 B2Uw (Binary to Unsigned)的缩写,长度为w来表示:
如4位二进制数:
前面我们说过有符号数在计算机中的机器数是以补码的形式存在的,其换算公式 B2Tw (Binary to Two`s complement):
如下面4位二进制数:
当然还有一种大众所知的方式:就是使用原码,反码,补码变换规律
首先要清楚我们计算机中统一使用的是加法计算,对你没听错。。计算机居然不会减法,哈哈。
在补码概念提出之前,我们来举几个例子:
可以看到在有负数参与的加法计算得到的结果是有误的。
如果需要得到正确的结果,计算器不得不是有其他方式去得到,这样必然就会影响运行效率。
为了解决负数在计算机中运行效率问题,科学家们提出了补码的概念。
那如何使用补码规则获取一个负数的真值呢?
假设我们从计算中获取了一个二进制为10000001的8位机器数,如何获取其真值。
我们回到前面分析运行效率时举的正正,负负,正负相加例子:
这里我们使用补码再来计算下:
可以看出,将符号以补码的形式存储在计算机中之后就可以使用加法来代替减法的操作,大大提高了计算机的运行效率。
通过文章前半部分介绍,相信你已经对补码有了一个比较全面的概念了,但是补码是怎么设计出来的呢?
数学里面有一个“补数”概念。
生活中有很多例子,只要是 带周期性的事务性质的都可以用补数来形容 。比如:时钟或者转盘等。
假设当前时间是2点,你要让时钟显示到12点,那么有两个方式。
对于时钟来说,不管你是方式1的加法运行还是方式2的减法运算,指针都指向了12点,实现的效果是一致的, 那我们就说+10和-2是两个补数,它们的绝对值之和12就是补数的模 。
这种规律也被应用到计算机二进制中 。下面我们使用一个例子来看:
假设要计算:(5)+(-1) = 5+(+?)
要将这个减法操作变为加法操作,首要任务就是找到模,然后得到-1的正补数相加即可 。
来看我们的时钟,每拨动12格为一个周期,就是说复原了,一样的, 8bit位范围是-128~127 ,(注意这里我们为了精简分析使用的是8位来测试计算,实际计算机中场景一般都是32位格式4个字节或者64位计算)所以 其一个周期就是256,也就是其模就是256 (1 0000 0000),不管你是加上256还是减少256,在二进制中,值都是不变的,因为最后一位是溢出位,不会去计算。
通过以上分析我们找到了-1(1 0 0 0 0 0 0 1)的模为256(1 0000 0000),-1的补数为(+255):0 1111 1111
这样就将5-1这个减法运算变更为了5+255这个加法操作
下面我们来看5+255:
5:0000 0101
255:0 1111 1111
二进制相加后:1 0000 0100 ->最高位溢出丢弃所以结果为4.
看到是不是和5-1结果一样呢?。
其实计算机中的补码也是这个模式: 找到一个与负数等价的正补数,使用该正补数代替负数,从而将减法运算替换为两个正数加法运算 ,补码的出现与运算器的电路设计有关,从设计者的角度看,希望尽可能简化电路设计和计算复杂度。而使用正补数代替负数就可以消除减法器,实现简化电路的目的。
我们下期见。
参考:为什么计算机中的负数要用补码表示?
全部0条评论
快来发表一下你的评论吧 !