C语言-数据的存储-浮点数的存储(8.2)

简介: C语言-数据的存储-浮点数的存储(8.2)

思维导图:


浮点型在内存中的存储

1.1一个经典的例子


#include 
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 浮点数存储规则

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


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


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

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

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

2^E表示指数位

举一个简单的例子:


十进制的 5.0


先转换成二进制:101.0


写成浮点数的形式:(-1)^0 * 1.01 * 2^2


相当于:S=0 , M=1.01 , E=2


那浮点数又是怎么存到内存里面的呢?


IEEE 754规定:


对于32位的浮点数,最高的1位是符号位s,


接着的8位是指数E,剩下的23位为有效数字M。



对于64位的浮点数,最高的1位是符号位S,


接着的11位是指数E,剩下的52位为有效数字M。



并且,规定中还有一些特殊的规则:


E是一个无符号整数,


这意味着当E为8位时,取值在1~255,


当E为11位时,取值在0~2047,


但是在实例中,E有可能为负数,所以,


IEEE 754规定,存入内存时E的真实值必须再加上一个中间数


单精度时加127,双精度时加1023


当然,规则总是说不完的,我们直接上实例:


1.3实践举例

我们通过刚刚学的存储方式,直接对一开始的那段代码进行分析:


#include 
int main()
{
    int n = 9;//以整形的形式存储
    //补码 - 00000000000000000000000000001001
    //转换形式
    //用浮点型的形式取出
    //0 00000000 00000000000000000001001
    //(-1)^0 * 0.00000000000000000001001 * 2^-126
    //0.000000
    float* pFloat = (float*)&n;//强制类型转换成浮点数的指针
    printf("n的值为:%d\n", n);//以整形的形式取出//没有变化,打印 9
    printf("*pFloat的值为:%f\n", *pFloat);//以浮点数的形式取出//打印 0.000000
    *pFloat = 9.0;//以浮点数的形式存储
    //9.0
    //二进制 - 1001.0
    //(-1)^0 * 1.001 * 2^3
    //s=0, e=3, m=1.001
    //补码 - 01000001000100000000000000000000
    printf("num的值为:%d\n", n);//以整形的形式取出//打印 1091567616
    printf("*pFloat的值为:%f\n", *pFloat);//以浮点数的形式取出//打印 9.000000
    return 0;
}


这就是浮点型在内存中的存储。


写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果喜欢本文的话,欢迎点赞和评论,写下你的见解。


如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。



相关文章
|
2月前
|
存储 编译器 C语言
C语言存储类详解
在 C 语言中,存储类定义了变量的生命周期、作用域和可见性。主要包括:`auto`(默认存储类,块级作用域),`register`(建议存储在寄存器中,作用域同 `auto`,不可取地址),`static`(生命周期贯穿整个程序,局部静态变量在函数间保持值,全局静态变量限于本文件),`extern`(声明变量在其他文件中定义,允许跨文件访问)。此外,`typedef` 用于定义新数据类型名称,提升代码可读性。 示例代码展示了不同存储类变量的使用方式,通过两次调用 `function()` 函数,观察静态变量 `b` 的变化。合理选择存储类可以优化程序性能和内存使用。
156 82
|
1月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
1月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
1月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
385 8
|
1月前
|
存储 C语言
C语言中的浮点数存储:深入探讨
C语言中的浮点数存储:深入探讨
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
7天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
23 6
|
27天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10