C语言浮点型数据在内存中的存储及取出等的介绍


前言

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 加上 11.01100000000000000000000
	
	所以取出为
	-1^0 * 1.01100000000000000000000 * 2^2 // 5.5

2. E全为0

  • 存入的E 全为0,则说明,标准形式中2 的指数非常接近 -127,说明此时的数字非常小。
  • 所以标准规定 此时 E1-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语言浮点型数据在内存中的存储及取出、有关案例等的介绍

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值