C语言 ——— 浮点数类型 在 内存中 的 存储模式

目录

浮点数存储规则

单\双精度浮点数 存储 S、M、E 的布局

有效数字M 和 指数位E 的特殊规定 

浮点数在内存中是否存储的S、M、E 


浮点数存储规则

根据国际标准IEEE754(电气和电子工程协会)规定:任意一个 浮点数F的二进制 都可以表示成以下形式:科学计数法

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


解析科学计数法: 

1.解析:(-1)^S

(-1)^S 表示的是 浮点数F符号位

S = 0 时,原式 = (-1)^0 =  1,此时的  1 就表示 浮点数F正数

S = 1 时,原式 = (-1)^1 = -1,此时的 -1 就表示 浮点数F负数

2.解析:M 

M 表示 有效数字,且 M 的取值范围是:M >= 1 && M < 2

3.解析:2^E

2^E 表示 指数位E 的取值为:有效数字M小数点 移动位数


举例说明:浮点数5.5 如何表示成 科学计数法

1.十进制的浮点数5.5 如何转换为 二进制:

整数部分的   5 转换为 二进制 为:101   --->   1*2^2 + 0*2^1 + 1*2^0 = 4 + 0 + 1 = 5

小数部分的0.5 转换为 二进制 为: 0.1   --->   1*2^(-1) = 0.5

合并:浮点数5.5 转换成 二进制 为:101.1 

2. 浮点数5.5 表示为 科学计数法

F = 5.5 = (-1)^0 * 1.011 * 2^2 

其中:S = 0M = 1.011E = 2


单\双精度浮点数 存储 S、M、E 的布局

由以上结论可以得出:只要有 S、M、E 这三个数时,就能 还原浮点数F

所以 IEEE754规定:内存中存储浮点数 时,存储的是 S、M、E 这三个数

单精度浮点数存储 S、M、E 的布局:

最高位存储的是 符号位S,后面的 8个bit位 存储的是 指数位E,剩下的 23个bit位 存储的是 有效数字M 


单精度浮点数存储 S、M、E 的布局:

最高位存储的是 符号位S,后面的 11个bit位 存储的是 指数位E,剩下的 52个bit位 存储的是 有效数字M 


有效数字M 和 指数位E 的特殊规定 

有效数字M 的特殊规定:

M 的取值范围:M >= 1 && M < 2

那么 M 的表示形式:1.xxxxxxxx,其中 xxxxxxxx 为小数部分

所以 IEEE754 规定省去 小数点前面 的 1,在内存 中 只保存小数点后面 的 部分,等到 读取 的时候,再把 小数点前面 的 1 加上

举例说明:M = 1.011

那么在内存中只会存储 011,只有等到 读取时加上 小数点前面的 1 


指数位E 的特殊规定: 

IEEE754 规定指数位E 是一个 无符号整数(unsigned int )

但 指数位E 在实际情况下 会 有为 负数 的情况:

如:浮点数0.5 转换为 二进制为0.1

F = 0.5 = (-1)^0 * 1.0 * 2^(-1) ;此时的 指数位E 就为 -1

所以为了规避这种情况:

IEEE754 规定指数位E 存入内存时的真实值 必须再加上一个中间数

中间数值 的规定:

对于  8个bit的E(单精度浮点数)中间数是127

对于 11个bit的E(双精度浮点数)中间数是1023  


浮点数在内存中是否存储的S、M、E 

创建 浮点数变量,调试代码,查看 浮点数内存存储的模式即可

代码演示:

float f = 5.5f;

 代码解析:

浮点数默认为 double类型,所以要在 5.5 后面加一个 f,用来强调 5.5float类型 

浮点数f 表示为科学计数法:

f = 5.5 = (-1)^0 * 1.011 * 2^2 

S = 0

M = 1.011   --->   M只存储小数点后的有效位:011 

E = 2   --->   E+127 = 129(float为单精度浮点类型)

浮点数f 的 S、M、E 在内存中表示形式:

S = 0;转换为二进制:0

M = 011;

E = 129;转换为二进制:1000 0001(记住:E是无符号整数,所以最高位是有效位)

转换为内存示意图如下:

大小端存储的相关知识请见:C语言 ——— 大/小端存储模式的介绍及判断-CSDN博客 

那么 浮点数5.5十六进制的形式内存中小端字节序存储 为:00 00 B0 40 

代码验证:

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 17:52:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 17:52:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 17:52:01       45 阅读
  4. Python语言-面向对象

    2024-07-20 17:52:01       55 阅读

热门阅读

  1. 算法刷题笔记 八数码(C++实现)

    2024-07-20 17:52:01       20 阅读
  2. Apollo开发指南

    2024-07-20 17:52:01       19 阅读
  3. Day05 Redis 面试题 下

    2024-07-20 17:52:01       18 阅读
  4. 【鸿蒙学习笔记】UI・页面路由 (@ohos.router)

    2024-07-20 17:52:01       19 阅读
  5. 《设计模式之美》学习笔记1

    2024-07-20 17:52:01       17 阅读
  6. WebKit 引擎:Web 组件的崛起与支持

    2024-07-20 17:52:01       20 阅读
  7. Python函数传参

    2024-07-20 17:52:01       18 阅读
  8. 带答案和解题步骤的数独题目分享

    2024-07-20 17:52:01       21 阅读
  9. 关于mysql架构的思考

    2024-07-20 17:52:01       17 阅读
  10. Android笔试面试题AI答之Activity(1)

    2024-07-20 17:52:01       15 阅读