首页 > 系统相关 >C语言 ——— 浮点数类型 在 内存中 的 存储模式

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

时间:2024-07-15 23:55:49浏览次数:17  
标签:存储 5.5 有效数字 浮点数 C语言 内存 bit

浮点数存储规则

根据国际标准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 在内存中表示形式:

标签:存储,5.5,有效数字,浮点数,C语言,内存,bit
From: https://blog.csdn.net/weixin_55341642/article/details/140448856

相关文章

  • 墨烯的C语言技术栈-C语言基础-012
    数组要存储1-100的数字,怎么存储?C语言中给数组的定义:一组相同类型元素的集合数组定义intarr[10]={1,2,3,4,5,6,7,8,9,10};//定义一个整型数组,最多放10个元素intmain(){ //0-9都是整数 intarr[10]={10,11,12,13,14,15,16,17,18,19};//arr是数组名 [......
  • 【C语言】位操作符详解 - 《开心消消乐》
    目录1.介绍2.位操作符列表3.按位操作符详解3.1按位与(&)示例输出3.2按位或(|)示例输出3.3按位异或(^)示例输出3.4按位取反(~)示例输出按位取反操作符(~)示例输出按位取反操作符详细解释3.5左移(<<)示例输出3.6右移(>>)示例输出4.应用实例4.1使用位掩码示例输出4.2......
  • C语言数据结构初阶排序(上篇)
    排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍......
  • 【C语言】指针由浅入深全方位详解
    目录指针定义指针类型野指针指针运算 指针与数组的联系二级指针 指针数组 字符指针 数组指针 数组参数,指针参数 函数指针 函数指针数组回调函数 练习题 代码仓库 指针定义1.指针是内存中一个最小单元的编号,也就是地址。2.平时口语中说的指针,......
  • Java 中有哪几种基本数据类型?请分别列出它们并简述每种数据类型的特点及其在内存中的
    在Java的世界里,数据是构建应用程序的基石。为了高效地处理这些数据,Java设计了一系列基础数据类型,它们直接映射到计算机硬件上,因此在性能和内存使用上更为高效。我们常说的Java八大基本数据类型,涵盖了整数、浮点数、字符和布尔值,下面我将一一介绍它们的特点以及在内存中的占用......
  • 内存管理-19-vmlinux.lds.S分析
    基于msm-5.4一、简介链接器主要任务是将符号引用解析到符号定义上,将多个目标文件(.o)和库文件合并成为一个可执行文件或者动态链接库,生成符号表,并对程序代码做最后的检查和优化。这个链接脚本在Linux内核里就是vmlinux.lds.S文件。vmlinux.lds.S编译后会在out/target目录......
  • Memcached:高性能内存缓存系统详解及实战
    引言在高并发的Web应用中,数据库往往成为性能瓶颈。为了提高数据读取速度和减少数据库负载,引入缓存机制变得至关重要。Memcached正是这样一款高性能、分布式内存对象缓存系统,它通过在内存中缓存数据来加速动态Web应用,从而极大地改善用户体验。本文将深入探讨Memcached的工作原......
  • 小白初识之C语言二
    重构:不增加代码功能,对代码结构的调整和优化,为了维护和拓展1.流程控制-顺序结构-分支结构(判断\选择)-循环结构2.分支-if-ifelse(三元运算替代)-ifelseifelseifelse(多路分支)-switch-case多路分支,有限,简洁3. 数组-一个标识符,存储多个值(大小是......
  • C语言<<左移运算符
    在C语言中,<<是位左移运算符(BitwiseLeftShiftOperator)。这个运算符用于将一个数的各二进制位全部左移若干位,由运算符右侧的数指定移动的位数,左侧操作数的位将向左移动,移动的位数由右侧操作数决定。移动过程中,左侧操作数左侧超出位数的部分将被丢弃,而在右侧增加的部分将用......
  • 【C/C++】结构体内存对齐
    结构体内存对齐详解1、第一个成员在与结构体变量偏移量为0的地址处2、其他成员变量要偏移到对齐数的整数倍的地址处,注意偏移是从结构体首地址处开始的。对齐数取的是编译器默认的一个对齐数与该成员大小 这个俩个数中的最小值。【VS中默认的值为8、Linu......