学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-1

简介: 3. 浮点型在内存中的存储(一). 字面(直接写出来的)浮点数: 3.14159 1E10 --> 1.0 * 10^10 (1.0 乘 10的10次方) --> E:底数是10

3. 浮点型在内存中的存储

(一). 字面(直接写出来的)浮点数:

3.14159

                   

1E10        -->        1.0 * 10^10     (1.0 乘 10的10次方)   -->        E底数10

(二). 浮点数类型:

             

浮点数:数据乘以相关权重后,小数点位置可以浮动的                

float        --        单精度浮点数        --        4字节

           

double        --        双精度浮点数        --        8字节

long double       --        更长的双精度浮点数       --       8字节

           

(可在 float.h头文件 查看该类型范围等信息)        

image.png

(三). 浮点数存储的例子:

           

内存中存储数据的时候,

%f 浮点数的形式获取数据

%d 整数的形式获取数据

不一样

           

#include <stdio.h>
int main()
{
  int n = 9;//4字节
  float* pFloat = (float*)&n;
  //把 n 的地址强制转换为 float类型 赋给指针变量 pFloat
  printf("n的值为:%d\n", n);
  //使用 %d 打印 n
  printf("*pFloat的值为:%f\n", *pFloat);
  //使用 %f 打印 地址中的内容
  *pFloat = 9.0;
  //使用指针变量把 9.0 赋给 n的空间
  printf("num的值为:%d\n", n);
  //使用 %d 打印 赋值后的 n
  printf("*pFloat的值为:%f\n", *pFloat);
  //使用 %f 打印 赋值后的 地址中的内容
  return 0;
}

image.png

说明 浮点数整型 在内存中存储获取形式不一样的(存储方式有差异

(以 整型 存储,可以用 整型 获取,但不能用 浮点数类型获取

(四). 浮点数存储规则

浮点数在计算机内部的表示方法

根据 国际标准IEEE(电气和电子工程协会)754 ,

任意一个 二进制浮点数V 可以表示成下面的形式:

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

             

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

任何数0次方都等于 1-11次方等于 -1

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

(这里 V 是二进制浮点数,所以这里 1 <= M < 2 )

           2 ^ E 表示 指数位                                              (几进制 这里就是 几^E,这里 V 是二进制浮点数,所以是 2^E

“小数点移了几位”,这里的 E 就是 几 )

           

例子:

2e801f0bff3c49a69e6b4f18ed7a040e.png

(五). IEEE 754 规定的 浮点数存储模型:

               

float -- 单精度浮点数存储模型:

对于32位的浮点数float),

最高的1位符号位S

接着的8位指数E

剩下的23位有效数字M            

d3e66b9b63be444d8a62f88ecc3dbc6c.png

double -- 双精度浮点数存储模型:

           

对于64位的浮点数double ),

最高的1位符号位S

接着的11位指数E

剩下的52位有效数字M

           

93d1cb4b534a483687783247b9aaca07.png

(六). IEEE 754 对 有效数字M 和 指数E 的特别规定:

             

有效数字M:          

前面说过,1<=M<2,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分

       

有效数字M的保存

IEEE 754 规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的 xxxxxx 部分

后面的 xxxxxx 部分

小数点前面不存只存小数点后面

         

有效数字M的读取

比如保存 1.01 时,只保存 01 ,等到读取的时候,再把第一位的1加上去。这样做的目的,是为了节省1位有效数字

32位浮点数 为例,留给 M只有23位,将第一位的1舍去以后,等于可以保存 24位有效数字

         (可以使保存的小数精度再高一点

指数E(比较复杂):

(1). 指数E 在内存中的存储:E 为一个 无符号整数(unsigned int)

这意味着,如果 E8位,它的取值范围0~255;如果 E 11位,它的取值范围0~2047        

但是,科学计数法中 E 可以出现负数的,所以 IEEE 754 规定存入内存E真实值必须再加上一个中间数(可以把E修正为正数,对于8位floatE ,这个中间数127;对于11位Edouble,这个中间数1023

           

比如,2^10E10,所以保存成 32位浮点数 时,必须保存10+127=137,即10001001

               

符号位S有效数字M指数E 例子:)


image.png

(计算符号位SS为0,符号为S为1,符号为

计算指数E移动位数 + 中间值

计算有效数字M小数点后的数,再用0补齐剩余位数

(2). 取出内存中的 指数E(三种情况):E不全为0或不全为1

这时,浮点数 就采用下面的规则表示:

指数E 计算值 减去中间值127(或1023),得到真实值存储时是真实值+中间值,再在 有效数字M 加上第一位的1

(存储时把第一位的1舍去了,其实就是按存储的相反形式取出,怎么放进去怎么取出来)。

(3). 取出内存中的 指数E(三种情况):E全为0

指数E 是通过 真实值+中间值 算出来的,如果E全是0,(32位系统)说明E的真实值是 -127

指数是-127说明这个值是非常小的

这时,直接规定浮点数的 指数E 等于 1-127(或者 1-1023 ),即为真实值

有效数字M加上第一位的1,而是还原为 0.xxxxxx 的小数

这样做是为了表示 ±0 ,以及 接近于0 的很小的数字

相关文章
|
5月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
78 3
|
5月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
487 13
|
5月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
165 11
|
5月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
5月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
5月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
5月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
5月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
5月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
128 4
|
5月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
110 6

热门文章

最新文章