杂谈c语言——6.浮点数的存储

news/2024/10/5 16:29:52/

1.浮点数在内存中的存储

常⻅的浮点数:3.14159、1E10等,浮点数家族包括: float、double、long double 类型。 浮点数表⽰的范围: float.h 中定义

1.1 练习 

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

输出什么呢?

答案是:

 

1.2 浮点数的存储

上⾯的代码中, num 和 *pFloat 在内存中明明是同⼀个数,为什么浮点数和整数的解读结果会差别 这么⼤?

要理解这个结果,⼀定要搞懂浮点数在计算机内部的表⽰⽅法。 根据国际标准IEEE(电⽓和电⼦⼯程协会)754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:

 举例说明:

5.5(十进制)==101.1(二进制),转换为二进制的科学计数法为1.011*2的2次方

就相当于(-1)的0次方*1.011*10的2次方

所以:

S==0;

M==1.011;

E==2;

浮点数的存储,就是存储S,M,E相关的值 !!!!!!

IEEE754规定:

1.对于32位的浮点数最⾼的1位存储符号位S接着的8位存储指数E剩下的23位存储有效数字M 

                                                float类型浮点数内存分配

2.对于64位的浮点数最⾼的1位存储符号位S接着的11位存储指数E剩下的52位存储有效数字M

                                          double类型浮点数内存分配

 2.浮点数存的过程

1.EEE754对有效数字M指数E,还有⼀些特别规定。

前⾯说过, 1≤M<2,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表⽰⼩数部分。 IEEE754规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去(即1不存储)只保存后⾯的 xxxxxx部分!!!!!!!!!!!!!!!!!!!!!!!!!!!。⽐如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。

这样做的⽬ 的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保 存24位有效数字。

2.⾄于指数E,情况就⽐较复杂 

⾸先,E为⼀个⽆符号整数(unsigned int)

这意味着,1.如果E为8位,它的取值范围为0~255;2.如果E为11位,它的取值范围为0~2047。但是,我 们知道,科学计数法中的E是可以出现负数的

举例:

0.5(十进制)==0.1(二进制)==1.0*2的-1次方,这就产生了负数!!!!

所以IEEE754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数:

1.对于8位的E,这个中间数是127

2.对于11位的E,这个中间数是1023

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

3.浮点数取的过程 

指数E从内存中取出还可以再分成三种情况:

1.E不全为0或不全为1

这时,浮点数就采⽤下⾯的规则表⽰,

1.指数E的计算值减去127(或1023),得到真实值

2.再将有效 数字M前加上第⼀位的1。

⽐如:0.5的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其 阶码为-1+127(中间值)=126,表⽰为01111110,⽽尾数1.0去掉整数部分为0,补⻬0到23位 00000000000000000000000,则其⼆进制表⽰形式为:

0 01111110 00000000000000000000000

2.E全为0 

这时,浮点数的指数E等于1-127(或者1-1023)!!!!!!!!!!!!!!!即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数

这样做是为了表⽰±0,以及接近于0的很⼩的数字。!!!!!!!!!!!!!

0 00000000 00100000000000000000000

3.E全为1

这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);

1 0 11111111 00010000000000000000000

4.题目解析 

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

 

1.n在内存中的补码是

0000 0000 0000 0000 0000 0000 0000 1001

 但是pfloat取数据的时候是按照浮点数的方式去取的,即

⾸先,将 9 的⼆进制序列按照浮点数的形式拆分,得到

1.第⼀位符号位s=0

2.后⾯8位的指数 E=00000000 

3.最后23位的有效数字M=00000000000000000001001

V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)  

E全是0符合情况2,所以输出为0.0000000 

2. pfloat存储9.0 即换算成科学计数法是:1.001×2^3

1.第⼀位的符号位S=0

2.有效数字M等于001后⾯再加20个0,凑满23位

3.指数E等于3+127=130, 即10000010

所以,写成⼆进制形式,应该是S+E+M,即

0 10000010 001 0000 0000 0000 0000 0000

这个32位的⼆进制数,被当做整数来解析的时候,就是整数在内存中的补码,原码正是 1091567616 。


http://www.ppmy.cn/news/1535033.html

相关文章

Vue.js组件开发教程

Vue.js 组件开发教程 Vue.js 是一款流行的前端框架&#xff0c;组件是其核心概念之一。通过将页面拆分为可复用的组件&#xff0c;可以提高代码的可维护性和可重用性。本教程将带您一步步学习如何开发 Vue.js 组件。 目录 什么是组件创建一个简单的组件组件注册 全局注册局部…

计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

如何利用ChatGPT开发一个盈利的AI写作助手网站

3-1 整体介绍写作助手及原型展示说明 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐步改变我们的生活方式&#xff0c;特别是在内容创作领域。本文将详细介绍如何利用ChatGPT技术&#xff0c;开发一个能够生成高质量内容的AI写作助手网站&#xff…

什么是IDE(集成开发环境)?

集成开发环境(IDE)详解 在软件开发的世界中,集成开发环境(IDE,Integrated Development Environment)扮演着至关重要的角色。它是一个综合性的软件应用程序,旨在为软件开发者提供一整套的、易于使用的工具集,以便他们能够更高效地编写、调试、测试和部署代码。简而言之…

macOS开发环境配置与应用开发

一、macOS开发环境配置 1. 安装Xcode Xcode 是Apple官方开发环境工具&#xff0c;用于macOS、iOS、watchOS和tvOS应用开发。它集成了代码编辑、编译、调试、性能分析、界面设计等功能。 下载与安装&#xff1a; 打开 App Store&#xff0c;搜索“Xcode”。 点击安装&#xff…

Spring Boot框架下的足球青训俱乐部管理

2 相关技术简介 2.1 Java技术 Java是一门伟大的纯面向对象的编程语言和编程语言。同时&#xff0c;它还是Java语言从嵌入式开发到企业级开发的平台。Java凭借其一次编译&#xff0c;任何地方执行的优点&#xff0c;使得盛行的web应用程序有大量的Java编译&#xff0c;很好地支…

GPT带我学-设计模式18-访问者模式

概述 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;用于将操作封装到一个访问者对象中&#xff0c;从而可以对不同类型的元素进行操作&#xff0c;而不需要改变这些元素的类。 主要应用场景 访问者模式的主要应用场景包括&#xff1a…

记一次教学版内网渗透流程

信息收集 如果觉得文章写的不错可以共同交流 http://aertyxqdp1.target.yijinglab.com/dirsearch dirsearch -u "http://aertyxqdp1.target.yijinglab.com/"发现 http://aertyxqdp1.target.yijinglab.com/joomla/http://aertyxqdp1.target.yijinglab.com/phpMyA…