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

负数补码表示范围以及规格化数原码形式下补码形式下负数补码规格化取值范围

以小数为例

原码形式下

  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.1111 1,1111~0,1111
补码 1.0000~0.1111 1,0000~0,1111
反码 1.1111~0.1111 1,1111~0,1111

在这里插入图片描述

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

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

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




现在从最大负数开始找起

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

前辈的博客就在这里啦

  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<=|尾数|.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210367.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:44
下一篇 2026年3月19日 上午7:45


相关推荐

  • swagger使用「建议收藏」

    swaggerrestfuldemo网络上swagger的配置,大多都是复制粘贴转发的。本人开始的时候参照了配置过,基本都是以失败告终。一怒之下,造死了搞,搭建了一个swagger描述的rest风格的接口demo工程。使用的版本号为spring4+jdk8+swagger0.8.4搭建过程中遇到不少问题,主要是swagger默认依赖的是spring3.与jdk8配合的时候,有点问题。直接将s

    2022年4月8日
    53
  • pyinstaller打包exe带图标

    pyinstaller打包exe带图标1.安装pyinstallerpipinstallpyinstaller2.打包pyinstaller-F-itest.icotest.py-F:不加依赖

    2022年6月17日
    41
  • 【云原生|技术基石】4:速通云原生基石-Istio服务网格

    【云原生|技术基石】4:速通云原生基石-Istio服务网格现在本篇文章的学习可以学到 Istio 的基本原理 架构以及组成部件的作用 Istio 提供一种简单的方式来建立已部署的服务的网络 具备负载均衡 服务到服务认证 监控等等功能 而不需要改动任何服务代码 简单的说 有了 istio 你的服务就不再需要任何微服务开发框架 典型如 springcloud dubbo 也不再需要自己动手实现各种复杂的服务治理的功能 很多是 springcloud 和 dubbo 也不能提供的 需要自己动手 只要服务的客户端和服务器可以进行简单的直接网络访问 就可以通过将网络层委托给

    2026年3月19日
    2
  • Midjourney学习指南【基础篇】

    Midjourney学习指南【基础篇】

    2026年3月15日
    3
  • Unity中的Shuriken粒子系统(5)

    Unity中的Shuriken粒子系统(5)设置速度在生命周期内改变(曲线的设置)1.VelocityoverLifetime通过ParticleSystem中的StartSpeed,只能设置粒子发射的起始速度,不能改变粒子发射过程中的速度;而VelocityoverLifetime能够改变粒子在运动过程中的速度。当把StartSpeed设为0(粒子初始速度为0),VelocityoverLifetime只设置X的值…

    2025年7月4日
    3
  • 看这里!2021年Java开发突破20k有哪些有效的路径?绝对干货[通俗易懂]

    看这里!2021年Java开发突破20k有哪些有效的路径?绝对干货[通俗易懂]前言微服务是近年来备受关注的话题,相比于传统的SOA而言,更容易理解,也更容易实践,它将“面向服务”的思想做得更加彻底。有人说它非常好,但就是“玩不起”,why?微服务是一种分布式系统架构,它建议我们将业务切分为更加细粒度的服务,并使每个服务的责任单一且可独立部署,服务内部高内聚,隐含内部细节,服务之间低耦合,彼此相互隔离。此外,我们根据面向服务的业务领域来建模,对外提供统一的API接口。微服务的思想不只是停留在开发阶段,它贯穿于设计、开发、测试、部署、运维等软件生命周期阶段。可见,我们提到的微服务,

    2022年7月8日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号