补码:
补码的实质是 变减为加
在计算机中使用加法器对数据进行计算,那么如何进行减法的运算呢?
设Mod=16
若a=3,b=-4,则a+b=a+b+Mod=-1+Mod=a+(Mod-4)=15(在计数系统中-1和15等价)
实际上Mod-4就是b的补数,所有的减法在计算机中都可以转化为加上减数的补数,对应计算机上的概念就是补码。
因此,计算机是使用补码(补数)进行计算。
减数与其补码两个数相加之和会将计算机所有位数清零。
对于N位(bit)计算机而言,一个减数与其补码之和可以使N位清零。
减数就是我们现实生活中人类可读的数字,补码是计算机识别的编码符号。
由减数转化为补码这个过程称为编码,如实际数字-9转换为补码91就是编码;
由补码转换为减数这个过程称为解码,如补码91转换为实际数字-9就是解码。
到这里你可能想明白了为什么8bit二进制计算机内补码1111_1111表示-1,为什么补码1000_0000是最大负数-128而不是-0了吧。
这样一来,00到99这100个补码就表示了实际数字-50到49。
二进制计算机也是如此,比如8bit计算机共有0000_0000到1111_1111一共256个补码。
256个补码一分为二,0000_0000到0111_1111共计128个补码表示正数,而且和实际数字一一对应。
比如补码0000_0000表示实际数字0,0000_1000表示实际数字8,0111_1111表示实际数字127.
1000_0000到1111_1111共计128个补码表示负数,和实际负数之间采用补码这种映射关系。
比如补码1111_1111表示-1,因为1111_1111加上0000_0001清零;补码1000_0000表示-128,因为1000_0000加上1000_0000清零。
如此一来,8bit二进制计算机就可以表示-128到127这些实际大小的数字了。
在计算机中,8位带符号二进制数的取值范围是[-128, 127],比如Java中byte类型。
这与我们上面的解释对应上了。
同时也澄清了一个误会,计算机最高位1表示负数,是因为1000_0000将256个补码恰好一分为二,用1000_0000及以后的补码表示负数。
计算机对于最高位是1的数字并不是将首位1直接变为负号,而是通过补码这种编码将其整体解码为负数。
所以不要将最高位的1与其它位的二进制数分离开来,分别看待。
扩展:
我们要先区分一下原码、反码和补码的表示规则:
0的表示:
原码:有正零和负零之分,[+0]补=0000 0000,[-0]补=1000 0000;
反码:同样有两种表示方法,[+0]反=0000 0000 ,[-0]反=1111 1111;
补码:零只有一种表示方法,不分正负,[0]补=0000 0000;
为二进制表示的范围为:
一个字节8位,如果采用原码表示正整数(含0),可以表达0-255,即 2^8=256,一共256种状态,从全0到全1的各种排列组合。如果要表示负数,则符号位需要占用一位(最高位,1代表负数,0代表正数),因此其绝对值最大范围为0-127,即2^7=128,一共正负各128种状态,如果不采用特殊处理,这时候0占用2个编码(10000000和00000000),数据表示范围为-127到-0及+0到127,这样总体上一个字节只有255种状态,因为其中0具有正0和负0之分,这不符合数学意义也浪费一个编码。
补码的算法为:绝对值的原码各位取反后加1.
例1:负1的补码: 绝对值的8位原码为00000001 取反:11111110 加1 :11111111 此时最高位被处理为1,满足高位为1代表负数的定义。
例2:负128的补码: 绝对值的8位原码为10000000 取反:01111111 加1 :10000000 此时同样的最高位被置为1,同样满足高位为1代表负数的定义,同时原先表示负0的编码被利用起来表示-128。 因此一个字节的有符号整数范围为-128到127。
综上为:
原码+反码:8位原码和反码能够表示数的范围是-127~127;
补码:8位补码能够表示数的范围是 -128~127。
(在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个)
通用点的形式为:
定点整数:(纯整数,小数点在最低有效位之后)
定点小数:(纯小数,小数点在最高有效位数值之前)
如2015年上半年
第1题:机器字长为n位的二进制数可以用补码来表示(1)个不同的有符号定点小数。
A. 2 ^n
B. 2 ^(n-1)
C. 2^ n -1
D. 2^( n-1 )+1
答:一定要审好题,问的是有多少个,查上表,可知范围为 -1 ~ 1-1/(2^(n-1))这些是多少个呢?这样依公式来算的话,估计二十分钟也算不出来。可以从 宏观上 看,补码可以表示数的范围是 2^n个,如8位有符号就是从-128 ~ 127,小数不过是前面加了一个小数点而矣,所以就选A
说到移码,肯定得说说阶码。因为移码通常用于表示浮点数的阶码。
阶码的定义:
想想10进制,125=0.125*10^3
那么可以说任意一个J进制数N,总可以写成
N = M * J^e
其中M是数N的尾数,M是一个纯小数
e就是N的阶码
J^e是比例因子
那么这个数N的小数点位置就随着比例因子的变化而浮动,这就是浮点表示法
阶码是浮点表示法中的概念ad
如2016年下半年试题:
第3题:设16位浮点数,其中阶符1位、阶码值6位、数符1位、尾数8位。若阶码用移码表示,尾数
用补码表示,则该浮点数所能表示的数据范围是()
A、-2^64 ~ (1-2^-8)2^64
B、-2^63 ~ (1-2^-8)2^63
C、-2^64 ~ (1-2-(1-2^-8)2^64 ~ (1-2^-8))2^64
D、-(1-2^-8)2^63 ~(1-2^-8)2^63
答:容易产生疑问的地方是阶码为6位,那么这6位包含阶符了吗,尾数也一样?
从答案可以知道,2^6=64,2^8,可知道,是不包含阶符及尾符的,其次要知道补码及移码范围一样都是-2^(n-1) ~ 2^(n-1)-1
可以排除带64的答案AC,比较BD项,最小数可以,B要更小些,所以选B。