【C语言技能树】浮点数在内存中的存储

简介: 这里执行完的结果是啥呢?相信没看过相关内容前都各有各的答案,咱暂且按下不表. 接下来看看浮点数在内存中如何存储的

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。


🌈个人主页:主页链接


🌈算法专栏:专栏链接


    我会一直往里填充内容哒!


🌈LeetCode专栏:专栏链接


目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出


🌈代码仓库:Gitee链接


🌈点击关注=收获更多优质内容🌈


81019c1cb23444b38595b3e6309b12ba.jpg


近期在复习计算机组成原理,刚好看到了浮点数存储,想起许久之前,就学过了,于是乎记录一下


浮点数存储例子:


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;
}


这里执行完的结果是啥呢?相信没看过相关内容前都各有各的答案,咱暂且按下不表. 接下来看看浮点数在内存中如何存储的


内存中的存储:


由于所有数在机器中都是以二进制的方式进行存储.如果是整形就很简单了,是多少就存多少.

这里以5举例,在二进制中为 101

那浮点数如何存储呢?

这里以5.5举例,他的二进制码为 101.1,前面很好理解,就是照搬5的存储方式

那后面呢?我们知道在整形里最低位为2^0,那么在浮点数中下一位自然是2^(-1),2^(-2)...依此类推


好的 我们知道了5.5的二进制码为101.1,这里将101.1转换为科学计数法就是1.011*2^(-2)


那么符号是啥呢,正号!那么就这样存储 (-1)^0*1.011*2^(-2)


让我们来观察下这组数据的存储格式,发现


有表式符号的 0(负数)或1(正数) 有表式有效数字的1.011 有表示数位的 -2


在浮点数中:称符号位为S,数位为E,有效数字为M


注:绿色为64位(double精度 以下为float类型举例


ec24440f48a0470ea8b3fbadad2fb4aa.jpg


符号位存储使用1个bit大小 这很好理解,0为正数1为负数

有效数字使用23个bit大小 因为有效数字为1.xxxxx所以我们舍去1的存储,仅在内存中存入xxxx在取出的时候再加入1即可

数位使用8bit大小,因为E中存在有符号情况,而为了表示的数字更多,我们不使用第一位作为符号位的情况,将数据+127后进行存储(如上面的-2 我们存入内存中为125)


数据取出:


了解完了如何存储,那如何取出呢


如上方5.5的例子:


在内存中存储为 0 10000001 01100000000000000000000000000000

在16进制中表示为 40 B0 00 00

将这个数据取出,

符号位S直接取出,为0

M也直接取出后在前面直接写上1.即可

E就有点麻烦了:

       分为三种情况 第一种情况不为全一或者全零则讲该数据直接-127取出即可

                              第二种情况为全一,此时为2^8=256-1=255 哪怕减去127也为2^128 有点太大了,所以我们直接将这种情况写为无穷(正负仍看符号位)

                              第三种情况为全0,此时1-127=-128 ,2^-128太小了,无穷小,所以我们直接补上符号位,也不再写1.x而是直接写上0.x

例子:


所以开头的例子输出应该为:

9

第二个变为浮点数存储

000000000000000000001001 此时E为0 变为无穷小 所以输出为0.00000

第三个结果在内存中以浮点数存储 输出9.0

但第四以整数的形式去读取浮点数存储

所以 9.0=1001=(-1)^0*1.001*2^(3)

0 10000010 00100000000000000000000000000000

所以输出的结果为10104000000000

完结撒花:


🌈本篇博客的内容【浮点数在内存中的存储】已经结束。


🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。


🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。


🌈诸君,山顶见!

目录
相关文章
|
1天前
|
程序员 编译器 C语言
C语言----动态内存分配(malloc calloc relloc free)超全知识点
C语言----动态内存分配(malloc calloc relloc free)超全知识点
14 6
|
1天前
|
存储 程序员 编译器
C语言:动态内存管理
C语言:动态内存管理
11 1
|
1天前
|
存储 编译器 程序员
C语言:数据在内存中的存储
C语言:数据在内存中的存储
13 2
|
1天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
15 2
|
1天前
|
存储
整数和浮点数在内存中存储
整数的2进制表⽰⽅法有三种,即原码、反码和补码。
17 0
|
1天前
|
存储 C语言 开发者
【C言专栏】C 语言实现动态内存分配
【4月更文挑战第30天】C语言中的动态内存分配允许程序运行时按需分配内存,提供处理未知数据量的灵活性。这涉及`malloc()`, `calloc()`, `realloc()`, 和 `free()`四个标准库函数。`malloc()`分配指定大小的内存,`calloc()`同时初始化为零,`realloc()`调整内存大小,而`free()`释放内存。开发者需谨慎处理内存泄漏和指针使用,确保程序的稳定性和性能。动态内存分配是C语言中的重要技能,但也需要良好的内存管理实践。
|
1天前
|
存储 程序员 C语言
C语言进阶第九课 --------动态内存管理-2
C语言进阶第九课 --------动态内存管理
|
1天前
|
Linux
Linux rsyslog占用内存CPU过高解决办法
该文档描述了`rsyslog`占用内存过高的问题及其解决方案。
42 4
|
1天前
|
移动开发 运维 监控
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!
|
1天前
|
监控 Python
【python】实现cpu/内存监控的功能(非常简单)
【python】实现cpu/内存监控的功能(非常简单)

热门文章

最新文章