文章目录
- 前言
- 一、浮点型在内存中的存储
- 二、浮点数存储规则
- 三、浮点数在内存中的存储(32位)float类型
- 四、浮点数在内存中的存储(64位)double类型
- 五、指数E从内存中取出分成三种情况
- 1. E不全为0或不全为1
- 2. E全为0
- 3. E全为1
- 六、有关案例
- 总结
前言
C语言浮点型数据在内存中的存储及取出、有关案例等的介绍
一、浮点型在内存中的存储
- 浮点型数据的范围是在 float.h 头文件中定义的。
- 整型的数据的范围是在 limits.h 头文件中定义的。
二、浮点数存储规则
-
浮点数的二进制位中,小数点后面数字的权重从2-1 ----> 2-2 ------>…等逐渐变化。
-
因此若表示5.5 则二进制表示方法位 101.1, 即为5.5。
-
但是,若表示5.6,101.11大于5.6, 101.101也大于5.6。
-
所以表示5.6 需要很多位0或1来凑,所以浮点数不能精确表示有些值,只能近似表示。
-
IEEE 754 规定
-
任何一个浮点数都可以表示成 -1S × M × 2E 。
-
S 若为0, 则为正数,若为1,则为负数
-
E指的是把M表示成科学计数法,小数点移动的位数, 类似于10进制科学计数法
-
M是一个 大于等于1并且小于 2 的数字
-
所以浮点数在内存中存储的是 S M E 相关的值
三、浮点数在内存中的存储(32位)float类型
- 最高位存储 S 即符号位
- 中间8位存储E的值
- E 是一个无符号整型的值,float类型范围为0 - 255,但是实际情况中E的值可能为负。
- 所以 标准规定,存入E的值时,用 E 的值 加 中间数来进行修正
- float 类型的中间数是 127.
- M 是有效数字在1 - 2 之间
- 但是存储时,只存储小数点后面的,不存储1,在使用时加上1即可。
四、浮点数在内存中的存储(64位)double类型
- 最高位存储 S 即符号位
- 中间11位存储E的值
- E 是一个无符号整型的值,double类型范围为0 - 2047,但是实际情况中E的值可能为负。
- 所以 标准规定,存入E的值时,用 E 的值 加 中间数来进行修正
- double 类型的中间数是 1023.
- M 是有效数字在1 - 2 之间
- 但是存储时,只存储小数点后面的,不存储1,在使用时加上1即可。
五、指数E从内存中取出分成三种情况
1. E不全为0或不全为1
- 这是浮点数就采用如下规则
- 指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位1。
- 例如
5.5 二进制位 101.1
表示成标准形式为 -1^0 * 1.011 * 2^2
- 存入数据时:
存入S 为 0
存入的E为 2 + 127 = 129 二进制为 10000001
存入M为 011 但需要在后面进行补0,至23位或52位
即 01100000000000000000000
所以存入的数据表示为
0 10000001 01100000000000000000000
E 的部分不全为0 或不全为1
- 取出数据时:
S 不变 S = 0
E 由存入的计算值减127得到真实值 2
M 加上 1 即 1.01100000000000000000000
所以取出为
-1^0 * 1.01100000000000000000000 * 2^2 // 5.5
2. E全为0
- 存入的E 全为0,则说明,标准形式中2 的指数非常接近 -127,说明此时的数字非常小。
- 所以标准规定 此时 E 为 1-127(或1 - 1023),M不再加上第一位的1,而是直接还原为0.xxxxxxx,表示**±0以及接近于0的很小的数字**。
3. E全为1
- 存入的E 全为1,则说明,标准形式中2 的指数非常接近 128,说明此时的数字非常大。
- 这时,如果有效数字M全为0, 表示±无穷大(正负取决于S)。
六、有关案例
#include <stdio.h>
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为: %d\n", n); // 9
// 9 的二进制序列为
// 00000000000000000000000000001001
// 以浮点型取出
// 0 00000000 00000000000000000000100
// E 全为0 结果为 0.000000
// 以浮点型进行存储
// -1^0 * 1.001 * 2^3
// 0 10000010 00100000000000000000000
// 以整型打印
// 01000001000100000000000000000000 // 一个很大的数
// 以浮点型打印
// -1^0 * 1.001 * 2^3 // 9.0
printf("*pFloat的值为: %f\n", *pFloat);// 0.000000
*pFloat = 9.0;
printf("num的值为: %d\n", n); // 1091567616
printf("*pFloat的值为: %f\n", *pFloat); // 9.000000
return 0;
}
总结
C语言浮点型数据在内存中的存储及取出、有关案例等的介绍