0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浮点数存储规则

strongerHuang 来源:CSDN 作者:夜风 2022-05-19 09:44 次阅读

为什么我们代码将浮点数、整数进行强制转换,或打印输出时会出精度损失,或出错的情况?

想要搞明白这个问题,就需要了解一下整数、浮点数的存储规则。

浮点数存储规则

根据国际标准IEEE(电气电子工程协会)规定,任何一个浮点数NUM的二进制数可以写为:

NUM = (-1) ^ S * M * 2 ^ E; (S表示符号,E表示阶乘,M表示有效数字) ①当S为0时,表示一个正数;当S为1时,表示一个负数; ②M表示有效数字,1<= M <2; ③2^E表示指数比如十进制的3.0,二进制就是0011.0 就可以写成(-1)^ 0 * 1.1 * 2 ^ 1 再比如十进制的-3.0,二进制就是-0011.0 就可以写成(-1)^ 1 * 1.1 * 2 ^ 1 而规定float类型有一个符号位(S),有8个指数位(E),和23个有效数字位(M) double类型有一个符号位(S),有11个指数位(E),和52个有效数字位(M) 以float类型为例:

cf0d6a96-d70c-11ec-bce3-dac502259ad0.png

IEEE对于(有效数字)M和(指数)E有特殊的规定(以float为例)1.因为M的值一定是1<= M <2,所以它绝对可以写成1.xxxxxxx的形式,所以规定M在存储时舍去第一个1,只存储小数点之后的数字。这样做节省了空间,以float类型为例,就可以保存23位小数信息,加上舍去的1就可以用23位来表示24个有效的信息。 2.对于E(指数)E是一个无符号整数所以E的取值范围为(0~ 255),但是在计数中指数是可以为负的,所以规定在存入E时,在它原本的值上加上中间数(127),在使用时减去中间数(127),这样E的真正取值范围就成了(-127~128)。 对于E还分为三种情况:①E不全为0,不全为1:这时就用正常的计算规则,E的真实值就是E的字面值减去127(中间值),M的值要加上最前面的省去的1。②E全为0这时指数E等于1-127为真实值,M不在加上舍去的1,而是还原为0.xxxxxxxx小数。这样为了表示0,和一些很小的整数。所以在进行浮点数与0的比较时,要注意。③E全为1当M全为0时,表示±无穷大(取决于符号位);当M不全为1时,表示这数不是一个数(NaN)

测试

代码如下:
void test(void){  float m=134.375;  char *a=(char*)&m;
  printf("0x%p:%d
",a,*a);  printf("0x%p:%d
",a+1,*(a+1) );  printf("0x%p:%d
",a+2,*(a+2) );  printf("0x%p:%d
",a+3,*(a+3) );}

代码输出结果:

cf3877b8-d70c-11ec-bce3-dac502259ad0.png

具体的计算过程如下:

cf8d2d8a-d70c-11ec-bce3-dac502259ad0.jpg

精度损失

我们可以把十进制的小数部分乘以2,取整数部分作为二进制的一位,剩余小数继续乘以2,直至不存在剩余小数为止。例如0.2可以转换为:0.2 x 2 = 0.4 00.4 x 2 = 0.8 00.8 x 2 = 1.6 10.6 x 2 = 1.2 10.2 x 2 = 0.4 00.4 x 2 = 0.8 00.8 x 2 = 1.6 1 即:.0011001…它是一个无限循环的二进制数,这就是为什么十进制小数转换成二进制小数的时候为什么会出现精度损失的情况。 之前前不久给大家分享的《单精度、双精度、多精度和混合精度计算的区别是什么?》可能大家不是很明白,今天看了浮点数的存储规则,你明白了吗?

整数的存储规则

理解了浮点数的存储规则,再理解整数就很简单了。

整数在内存中都是以补码的形式进行存储,整数有正负之分。当需存储有符号数时,用第一位来表示正(0)和负(1)。

正数的反码和补码还是它本身,下面主要讨论下负数的反码和补码。反码是其原码除去最高符号位后其余位按位取反,补码是其反码在加上1 。

测试代码:
void test(void){  int8_t n=-123;  uint8_t *p=(uint8_t *)&n;
  printf("%d
",n);  printf("%d
",*p);  }
输出结果:cfab5bb6-d70c-11ec-bce3-dac502259ad0.png

计算过程如下:

cfc4d2e4-d70c-11ec-bce3-dac502259ad0.jpg

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    709

    浏览量

    41266
  • 浮点数
    +关注

    关注

    0

    文章

    58

    浏览量

    15795
  • 代码
    +关注

    关注

    30

    文章

    4557

    浏览量

    66826

原文标题:内存中整数和浮点数存储的差异

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    浮点数如何存储

    浮点数如何存储玩转浮点数
    发表于 12-30 07:10

    浮点数的表示方法

    浮点数的表示方法  浮点数,是指小数点在数据中的位置可以左右移动的数据。它通常被表示成:    N = M* RE  这里的M(Mantissa)被称为浮点数
    发表于 10-13 17:13 1.6w次阅读
    <b class='flag-5'>浮点数</b>的表示方法

    浮点数常用的编码方法

    浮点数常用的编码方法  前面已经说到,在计算机内,浮点数被表示为如下格式:    通常情况
    发表于 10-13 17:21 4171次阅读
    <b class='flag-5'>浮点数</b>常用的编码方法

    在程序中得到一个浮点数的组成数

    浮点数存储时,是存储连续的字节中的,只要设法找到存储位置,就可以得到这些数了。可以定义一个void的指针,将此指针指向需要存储
    发表于 04-21 15:52 30次下载

    modbus 如何读取浮点数

    本文为大家介绍modbus读取浮点数的两个程序设计。
    发表于 02-08 10:03 1.4w次阅读

    Xilinx怎么定点数浮点数

    转化为的浮点数可以是单精度也可以是双精度。
    发表于 07-05 08:09 3742次阅读
    Xilinx怎么定<b class='flag-5'>点数</b>转<b class='flag-5'>浮点数</b>

    浮点数在内存中的存储

    浮点数在内存中的存储和整数不同,因为整数都可以转换为一一对应的二进制数据。而浮点数存储是由符号位 (sign) + 指数位 (exponent) + 小数位 (fraction) 组
    的头像 发表于 09-20 10:52 3760次阅读
    <b class='flag-5'>浮点数</b>在内存中的<b class='flag-5'>存储</b>

    谈一谈浮点数的精度问题

    还是要从浮点数存储和标识出发来处理该问题,既然浮点数天然就存在一定的误差,而有时候计算又无法获得唯一的数值,如下图所示,浮点数计算出来的实轴上的值都会因为
    的头像 发表于 08-11 14:28 3426次阅读
    谈一谈<b class='flag-5'>浮点数</b>的精度问题

    什么是浮点数浮点数在内存中的存储

    浮点型简单讲就是实数的意思。浮点数在计算机中用以近似表示任意某个实数。
    的头像 发表于 11-09 11:07 3696次阅读
    什么是<b class='flag-5'>浮点数</b>?<b class='flag-5'>浮点数</b>在内存中的<b class='flag-5'>存储</b>

    什么是浮点数

    Python数据类型第一种:字符串(str)。 Python数据类型第二种:整数(int)。 Python数据类型第三种:浮点数浮点数的英文名是float,浮点数没有简写。
    的头像 发表于 02-23 14:58 3762次阅读

    西门子PLC浮点数程序案例分享

    64位浮点数保存于VB0开始的存储区中,转换得出的32位浮点数保存于VD100中。
    发表于 10-27 17:07 1441次阅读
    西门子PLC<b class='flag-5'>浮点数</b>程序案例分享

    单精度和双精度浮点数的区别

    在计算机科学和数值计算中,浮点数是一种用于表示实数的数据类型。浮点数有两种精度级别:单精度和双精度。这两种精度级别在表示范围、精度和存储空间等方面都有所不同。本文将详细介绍单精度和双精度浮点数
    的头像 发表于 12-13 10:55 1531次阅读

    单精度和双精度浮点数的区别

    单精度和双精度是计算机中表示浮点数的两种不同的精度。在计算机中,浮点数用来表示带有小数部分的实数,而单精度和双精度用来表示浮点数的精确程度不同。在以下文章中,我将详细介绍单精度和双精度浮点数
    的头像 发表于 12-15 10:25 2615次阅读

    modbus浮点数怎么读取

    Modbus是一种通信协议,常用于工业自动化系统中的设备之间的通信。它支持多种数据类型,包括整数、浮点数、字符串等。浮点数在工业领域中广泛应用,因此了解如何读取和处理Modbus浮点数是非
    的头像 发表于 12-28 14:38 1725次阅读

    一文带你秒懂IEEE 754浮点数

    一、简介1、常见的浮点数表示方式是IEEE754标准,它规定了浮点数存储格式和运算规则,这个标准定义了两种浮点数表示:单精度和双精度。2、
    的头像 发表于 03-18 08:09 936次阅读
    一文带你秒懂IEEE 754<b class='flag-5'>浮点数</b>