软考考点之数据的表示

补码:

补码的实质是    变减为加

  在计算机中使用加法器对数据进行计算,那么如何进行减法的运算呢?

  设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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值