负数补码表示范围以及规格化数

以小数为例

原码形式下

  1. 想象出一个数轴
------------------------0------------------>
  1. 将0用原码表示,设机器字长为5,一位符号位,放在数轴上
----------------1.0000------0.0000---------->
  1. 不难想象从+0向正半轴的表示范围是0.0000 ~ 0.1111即0~1-2-4
  • 从-0往负半轴也要有这么大的表示范围,即-(1-2-4)~ 0
  1. 故原码小数的表示范围为-(1-2-4)~ 1-2-4,但此时注意负0和正0之间有“一个单位的空间”,此单位长度为0.0001,即2-4(机器无法表示所有连续的小数,故其储存的仍旧是离散的,根据位数的不同,其精确度不一样)

补码形式下

  1. +0和-0合二为一,那整个数轴就多出一个单位,那这个单位用来干什么呢?
  2. 这个多出来的单位长度为负半轴扩展了表示范围
1.0000--.....---1.0001---0.0000---0.0001---->
  1. 原本用来表示-0的1.0000被拿到负半轴最左端,它表示什么数呢?
  2. |-(1-2-4)|+|-2-4|=1 ,1.0000用来表示-1,负半轴可以延伸到整整1的位置,故补码形式下表示范围是 -1 ~ 1-2-4
    由此不难得到其他形式的取值范围
定点机小数定点机整数定点机
原码1.1111~0.11111,1111~0,1111
补码1.0000~0.11111,0000~0,1111
反码1.1111~0.11111,1111~0,1111

在这里插入图片描述

补码规格化下的负数取值范围

规格化:规格化又叫做规格化数是一种表示浮点数的规格化的表示方法,还可以通过修改阶码并同时移动尾数的方法使其满足这种规范。

什么意思呢?
就是通过移动尾数,修改阶码,把尾数移动,要想保证真值不变,必定增减阶码,那么把尾数弄成什么样子呢?
解释如下:

对于规格化浮点数小数点后第一个值是固定的(正数:1,负数:原码1,补码0),所以该位往往缺省,称为隐藏位。
规格化要求尾数:
1/R<=|M|<1
R=2时: 1/2<=|M|<1 即1/2<=|M|<1
将一个浮点数转换为规格化的过程,称为浮点数规格化。

就是说正数要变成0.1XXXXX,负数原码要变成1.1XXXXX,补码就是1.0XXXXXX
问题又来了?
补码规格化后负数的取值范围是怎么样,为什么非得1.0XXXXX的形式?不能1.1XXXXX? 后文解答

现在从最大负数开始找起

这是我弄不懂的地方,偶然间看到了前辈的推理,让我好好思考了一番,以下内容多为转述,这里附上前辈的博客

参考

  1. 如果不考虑规格化,最大负数必定为-0.0001,原码1.0001,补码1.1111,显然不符合1.0XXXX的形式
  2. 根据1/2<=|M|<1,不难理解正数要为0.1XXXX的格式,小数点后一位为1,转化为十进制的1/2.
  3. 现在来探索规格化负数补码的范围
  • 继续往后取,最大负数取-0.0010,原码1.0010,补码1.1110,仍旧不符合1.0XXXXX形式
  • 取-0.0011,原码1.0011,补码1.1101,不符合
  1. 思考:如果使补码形式为1.0XXXX,那么原码形式为如果为1.0XXXX取反+1后仍为1.0XXX的只有1.0000,显然为0不为负数,所以原码应该为1.1XXXX形式
  • 取-0.1000,原码1.1000,补码1.1000,这时刚好为-1/2,符合尾数规格化的范围,但补码形式不符合
  • 取-0.1001,原码1.1001,补码1.0111,符合,这是负数补码规格化的最大值,形式为1.01111…11111
  1. 思考:规格化的目的说明如下

为了提高精度需要使尾数的有效位数尽可能占满可用的位数。这种措施称为浮点数的规格化。

  • 为什么尾数范围规定在1/2<=|M|<1的范围就可以使有效位数尽可能的占满可用的位数呢?
  • 这种移动尾数,增减阶码的操作是为了满足上述目的?
  1. 再思考:小数点不动,将尾数左移,每左移一位,阶码减一,保持真值不变,左移到什么程度,就不能再移动? 不能再移动表示->如果再移动就要损失有效数字,故遇到1时规格化停止,原码形式为0.1XXXX,所以1/2<=|尾数|.

结论:负数补码规格化最大负数形式为1.0111…111,原码为1.1000…001,最小负数自然是1.0000000…00(-1)
故范围为:-1~ -(1/2+2-n

最后一问:当取-0.1000时,原码1.1000,补码1.1000,这时刚好为-1/2,符合尾数规格化的范围,为什么不从这里开始取值呢?
答:为了机器判断方便,往往不把-1/2列入规格化的数,因此,机器只要判断运算结果的尾数最高位(数符)与尾数次高位(第一有效位)是否相同,便可以判断是否是规格化的数。

有不对的地方还请大家指正吖

  • 82
    点赞
  • 252
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
1. 变形补码加减运算: 变形补码是一种用于表示负数的二进制编码方式。在进行加减运算时,需要先将被加和加转换为变形补码,然后进行运算,最后将结果转换为原码。 举个例子: 假设需要计算 -5 + 3 的结果,步骤如下: - 将 -5 转换为变形补码:首先将 5 转换为二进制 00000101,然后按位取反得到 11111010,最后将结果加 1 得到变形补码 11111011。 - 将 3 转换为变形补码:3 的二进制表示为 00000011,因此它的变形补码和原码相同,都是 00000011。 - 进行加法运算:将两个变形补码相加,得到 11111110。 - 将结果转换为原码:将 11111110 转换为原码,首先减去 1 得到 11111101,然后按位取反得到 00000010,最后加上符号位得到 -2,即 -5 + 3 = -2。 2. 浮点规格化表示: 浮点规格化表示是指将一个浮点表示为一个带有指和尾的定点的形式。其中,指部分表示浮点的位移量,尾部分表示浮点的有效字。规格化表示的目的是为了方便进行浮点的比较和计算。 举个例子: 假设需要表示浮点 0.0125,它可以表示为 1.25 * 10^-2 的形式。将这个表示规格化形式需要进行以下步骤: - 将 1.25 转换为二进制:1.25 的二进制表示为 1.01。 - 将指部分表示为二进制:10^-2 的指部分为 00000010。 - 在尾部分前加上一个隐含的 1,得到 1.01。 - 将尾部分向左移动两位,得到 101。 - 将指部分和尾部分拼接起来,得到规格化表示:0 00000010 101。其中,第一位表示符号位,0 表示。指部分为 00000010,尾部分为 101。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值