iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言浮点型数据在内存中的存储方式是什么
  • 622
分享到

C语言浮点型数据在内存中的存储方式是什么

2023-07-05 18:07:34 622人浏览 泡泡鱼
摘要

本篇内容介绍了“C语言浮点型数据在内存中的存储方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、思考一下咱们先上一盘开胃菜,试试看

本篇内容介绍了“C语言浮点型数据在内存中的存储方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    一、思考一下

    咱们先上一盘开胃菜,试试看叭

    #include<stdio.h>int main(){int n = 9; float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);*pFloat = 9.0;printf("num的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);return 0;}

    路飞:请问打印出来都是什么结果呢?贝吉塔:简单,喏

    C语言浮点型数据在内存中的存储方式是什么

    路飞:哈哈~虽然很符合直观想法,但是错啦错啦,喏

    C语言浮点型数据在内存中的存储方式是什么

    贝吉塔:蛤??!这么奇怪的结果

    二、浮点数存储规则

    既然上述结果跟我们所理解的整型数据存储方式的结果不同,这就说明浮点型数据在内存中的存储方式是不一样滴~

    2.1 浮点数表示方法的规定

    详细解读:

    根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:

    • (-1)^S * M * 2^E

    • (-1)^S表示符号位。当S=0,V为正数;当S=1,V为负数

    • M表示有效数字,大于等于1,小于2

    • 2^E表示指数位

    举例来说:

    十进制的5.5,写成二进制是101.1,相当于(1)^0 * 1.011 * 2^2,此时

    aiphabetValue
    S0
    M1.011
    E2

    此时会有铁汁有疑问,为什么5.5的二进制是101.1??不应该是101.101吗?

    我们看看下图,假如是101.101,那么转换成十进制就是5.625,因为二进制每一位的权重都不同,不能想当然

    C语言浮点型数据在内存中的存储方式是什么

    假如说给的十进制是5.3,那么这个0.3是不能精确表示的,所以说浮点数容易丢失精度

    2.2 浮点数的存储

    2.2.1 IEEE 754规定

    对于32位的浮点数(float),最高的1位是符号位S,接着的8位是指数E,剩下的23位是有效数字M

    C语言浮点型数据在内存中的存储方式是什么

    对于64位的浮点数(double),最高的1位是符号位S,接着的11位是指数E,剩下的52位是有效数字M

    C语言浮点型数据在内存中的存储方式是什么

    2.2.2 IEEE 754对有效数字M,还有一些特别规定

    前面说过,1&le;M<2,也就是说,M可以携程1.xxxxxx的形式。其中xxxxxx表示小数部分

    IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx。比如保存1.01时,只保存01,等到读取的时候再放回去,这样做的目的是节省空间

    2.2.3 IEEE 754对指数E,还有一些特别规定
    1. 首先,E为一个无符号整数(unsigned int),这意味着,如果E为8位,它的取值范围为0-255;如果E为11位,它的取值范围为0-2047。

    2. 但是我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数

    3. 对于8位的E,中间数取127;对于11位的E,中间数取1023。

    4. 比如2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即为10001001

    2.2.4 实操一下看看是怎样存储的
    int main(){float f = 5.5f;//(-1)^0 * 1.011 * 2^2//S = 0//M = 1.011//E = 2//这样存: 0 10000001 01100000000000000000000//也就是: 0100 0000 1011 0000 0000 0000 0000 0000//十六进制表示: 40 b0 00 00return 0;}

    5.5float存储,如图所示

    C语言浮点型数据在内存中的存储方式是什么

    转换成十六进制就是40 b0 00 00,咱们调试看看叭~因为VS是小端字节序存储,所以地址由低到高看到的是00 00 b0 40

    C语言浮点型数据在内存中的存储方式是什么

    2.3 浮点数从内存中取出

    2.3.1指数E从内存中取出分三种情况

    SM的取出很简单,原样返回,但是E我就得仔细谈谈了

    • E不全为0或不全为1:

    这时,把E减去之前加上去的127(或1023),得到真实值,再讲有效数字M前加上第一位的1,这种情况最简单,逆着来就是了

    • E为全0:

    这时真实的E为-127(或-1023),太小了,所以规定浮点数的指数E等于1-127(或1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示&plusmn;0,以及接近于0的很小的数字(这是规定,大家不要纠结)

    • E为全1:

    这时真实的E128,太大了,如果有效数字M全为0,表示&plusmn;无穷大(正负取决于符号位S)

    2.3.2 实操一下看看是怎样取出的

    我们回到最开始的代码,看看能不能解决啦

    #include<stdio.h>int main(){int n = 9; float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);*pFloat = 9.0;printf("num的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);return 0;}

    答案:

    C语言浮点型数据在内存中的存储方式是什么

    • 先分析前两个输出:

    首先,9int类型的,存储按整型存储规则,就是在内存中都是以补码形式存放的,而正数的原码、反码、补码都一样

    int9
    原码00000000000000000000000000001001
    反码00000000000000000000000000001001
    补码00000000000000000000000000001001

    第一个输出是以%d(十进制整型)输出,所以输出结果确实是9

    第二个输出,pFloat指针认为数据是以单精度浮点数类型存储的,所以解应用的时候也是这么做的。此时pFloat发现E全为0,按照上述规则,9取出来就变成0.000000000000000000001001 * 2^-126,即使不管后面的指数!有效数字都已经非常小了!所以打印出来小数点后6位看到的是0.000000

    C语言浮点型数据在内存中的存储方式是什么

    然后,分析后两个输出:

    首先,9.0float类型的,存储按浮点数存储规则,即为
    (-1)^0 * 1.001 * 2^3

    float9.0
    S0
    M1.001
    E3

    存到内存里就是:

    C语言浮点型数据在内存中的存储方式是什么

    于是第三个输出,%d把它当整型输出,那么在整型眼里,直接把这32位直接转成十进制输出了,就造成了输出结果为1091567616

    而第四个输出就是按float类型输出的,所以结果就是9.000000

    “C语言浮点型数据在内存中的存储方式是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: C语言浮点型数据在内存中的存储方式是什么

    本文链接: https://www.lsjlt.com/news/354657.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C语言浮点型数据在内存中的存储方式是什么
      本篇内容介绍了“C语言浮点型数据在内存中的存储方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、思考一下咱们先上一盘开胃菜,试试看...
      99+
      2023-07-05
    • C语言数据(整数、浮点数)在内存中的存储
      本篇主要讨论:整数、浮点数在内存中是怎么保存的! 数据类型详细介绍 在前面C语言基础概览中,已经提到过了基本的C语言内置类型,但C语言的数据类型有无数种~ 但是可以把这些类型分为几个...
      99+
      2022-11-12
    • C语言详细分析浮点数在内存中的储存
      目录浮点数的储存格式初步了解深入探究E不全为0或不全为1E全为0E全为1浮点数的储存格式 初步了解 首先让我们通过一段代码来认识一下浮点型和整型的区别: int main() { ...
      99+
      2022-11-13
    • C语言数据的存储超详细讲解下篇浮点型在内存中的存取
      目录前言浮点型在内存中的存储浮点数存储的例子浮点数存储规则IEEE 754规定IEEE 754对有效数字M的特别规定IEEE 754对指数E的特别规定存入内存是E的规定从内存取出时E...
      99+
      2022-11-13
    • C语言中数据存储方式是什么
      这篇文章主要介绍“C语言中数据存储方式是什么”,在日常操作中,相信很多人在C语言中数据存储方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中数据存储方式是什么”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-08
    • C语言数据在内存中的存储
      这篇文章主要介绍了C语言数据在内存中的存储,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数据类型详细介绍在前面C语言基础概览中,已经提到过了基本的C语言内置类型,但C语言的数...
      99+
      2023-06-15
    • C语言中数据在内存中是怎么存储的
      本篇文章为大家展示了C语言中数据在内存中是怎么存储的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。数据类型常见的数据类型常见的数据类型字节char字符数据类型1short短整型2int整形4long...
      99+
      2023-06-22
    • C语言详解float类型在内存中的存储方式
      目录1.例子2.浮点数存储规则1.例子 int main() { int n = 9; float *pFloat = (float *)&n; ...
      99+
      2022-11-13
    • C语言详细图解浮点型数据的存储实现
      目录在引入知识之前,先来看一个案例,就知道了解浮点型数据存储的重要性与必要性。 举个例子: #define _CRT_SECURE_NO_WARNINGS 1 #include<...
      99+
      2022-11-13
    • C语言数据在内存中是怎样存储的
      这篇文章主要介绍“C语言数据在内存中是怎样存储的”,在日常操作中,相信很多人在C语言数据在内存中是怎样存储的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据在内存中是怎样存储的”的疑惑有所帮助!接下来...
      99+
      2023-06-08
    • C语言中数据是如何存储在内存中的
      目录前言‍数据类型介绍‍整形数据在内存中存储‍浮点型数据在内存存储前言 在计算机内存中,数据的存储方式都是以0和1的形式存储,也就是二进制的形式,数据是如何向...
      99+
      2022-11-13
    • C语言中字符串数据在C中的存储方式是什么
      这篇文章主要介绍“C语言中字符串数据在C中的存储方式是什么”,在日常操作中,相信很多人在C语言中字符串数据在C中的存储方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中字符串数据在C中的存储方式...
      99+
      2023-07-02
    • C语言数据在内存中的存储详解
      目录文章摘要一、C语言的数据类型数据类型基本分为: 二、隐式类型转换1.什么是隐式类型转换2.整型提升 3.类型转换三、机器大小端1.什么是大小端2.大小端在截断的应用3....
      99+
      2022-11-12
    • C语言编程数据在内存中的存储详解
      目录变量在计算机中有三种表示方式,原码反码,补码原码反码补码总结一下浮点数在内存的储存C语言中,有几种基本内置类型。 int unsigned int signed int cha...
      99+
      2022-11-12
    • C语言中的字符串数据在C中的存储方式
      目录内存中的五大区域字符串数据在C语言中有两种存储方式几个比较容易混的点统计字符串中某一个字符出现的次数使用字符指针数组来存储多个字符串数据内存中的五大区域栈:是专门用来存储局部变量...
      99+
      2022-11-13
    • 关于C语言中数据在内存中的存储详解
      目录前言一、数据类型介绍1.类型的基本归类1.整形家族2.浮点型家族3.构造类型4.指针类型5.空类型二、整型在内存中的存储1.原码、反码、补码2.内存中怎样存储3.大小端字节序1....
      99+
      2022-11-12
    • c语言的内存分配方式是什么
      在C语言中,内存分配主要有以下几种方式:1. 静态内存分配:在程序编译阶段分配内存空间,存储在静态存储区。例如,全局变量和静态变量的...
      99+
      2023-10-12
      c语言
    • C语言进制转换、整数和小数内存存储模型是什么
      本篇内容主要讲解“C语言进制转换、整数和小数内存存储模型是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言进制转换、整数和小数内存存储模型是什么”吧! 什么是进制进制也就是进位...
      99+
      2023-06-08
    • C语言数据在内存中的存储流程深入分析
      目录前言类型的基本分类整型浮点数自定义类型整型在内存中的存储原码、反码、补码大端和小端如何判断编译器是大端还是小端浮点数在内存中的存储总结前言 C语言中有char、short、int...
      99+
      2022-11-13
      C语言数据在内存中的存储 C语言数据存储
    • Java中float在内存中的存储方式是什么
      本篇内容介绍了“Java中float在内存中的存储方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最近在讲Java基础,讲到数据类型...
      99+
      2023-06-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作