浮点数类型在内存中的储存

一、浮点数的介绍

1.浮点数的理解

  • 首先我们需要了解到浮点数就是数学中的小数.
    ——————
    但为什么在计算机语言中要叫做浮点数呢?

1.首先知道【12.3】是小数的
2.但是还可以写成【1.23*10^1】
3.在对这两个数字比较,不难发现:同一个数用不同的科学计数法表现中,小数点是在浮动的,所以这就叫作浮点数

2.浮点数类型介绍

1.浮点数类型包括了以下类型:

float 、double 、long double

2.浮点数表示的范围定义在flaot.h中:
如看它的定义:
在这里插入图片描述

浮点数类型在内存中的储存方式

  • 在上面我们知道了如何表达一个浮点数,但是又该如何存入内存中呢?还是和整形一样么?
    对于==还是和整形一样么?==这个疑问我们来探究一下:大家如果还不太清楚整形在内存中是如何储存,可以看看哟: 我的上一篇博客整形在内存中的储存
    可以看到用一下代码来探究一下:
#include<stdio.h>

int main()
{
    
    
	int i = 9;
	float* p =(float*) & i;

	printf("%d\n", i);
	printf("%f\n", i);

	return 0;
}

在这里插入图片描述

  1. 当然如果和整形的存储方式不一样,那到底是这样存储的呢?
    接下来就是我们的重头戏

存储规定:

按照国际标准IEEE 754,任意一个进制浮点数V可以表现成下面的形式:

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

  1. 其中 (-1)^S 表示有效数字,当S为0时,V为正数,S为1时,V是负数。
  2. M表示有效数字,范围规定:大于1,小于2。
  3. 2^E表示的是指数位。

要将一个浮点数写成进制形式:一定需要S、M、E的值

————

那让我们看看一个浮点数是如何变成进制形式:

在这里插入图片描述

由此可以看出:V = (-1)^S * M * 2^E
5.5 --> 101.1 —> 1.011 * 2^2
所以 S = 0,M = 1.011,E = 2;

注意:也可以想到只要有S,M,E的值,就可以还原出这个浮点数。

一、浮点数类型储存

  • 国际标准 IEEE 754 规定 :
    当要在内存中存放单精度浮点数类型:

在这里插入图片描述
当然除了这些,还没完,在国际标准 IEEE 754 对于有效数字M和指数E有一些特殊的存储规定

1.因为以上知道,M是有效数字,范围:1<=M<2,在计算机内存保存M时,默认这个数第一位总是1,可以被舍去(在读取的时候,再把第一位加上),只保留小数点后面的;如:当保留 101.1 时:只保存了 011,为了更方便理解,如图所示:

在这里插入图片描述

2.对于指数 E 的存入就会有点特殊:
首先 E 是一个无符号数字(unsigned int)。
因为在8位的时候,其有范围0 ~ 255;而在11位的时候,其范围是 0 ~ 2047,但是由科学计数法知道,这时可以有负数的,(当存入 0.5 时,E = -1),所以在IEEE 754规定:存入内存时E的真实值需要加上一个中间值,对于8位来说其中间值是 127 ,对于11位来说其中间值是 1024.

而对于双精度浮点数类型的存放:

在这里插入图片描述

对于指数E从内存中取出分为三种:
1.当E全为0时:也就是说指数E的真实值等于 -127,有效数字M不再加上1,而是0.xxxxxx这样的小数,这样做的目的是为了表示这样几乎很小很小的数,接近与0。
——
2.当E全为1时:也就是说这样的数表示无穷大(正负取决于S)。
——
3.当E有1有0时:即指数E的计算值减去127(或1024)得到真实值,然后由规定正数部分必须为1,(即M取出后加1)。

对于浮点型在内存中的存储就是这样,下面我将举个例子方便大家给号的理解:

int main()
{
    
    
	float n = 9.0;
	int* p = (int*)&n;

	printf("%f\n", n);
	printf("%d ", *p);

	return 0;
}

在这里插入图片描述
最后希望同志们看了我的解释都能收货到自己的东西,最后加油吧,mount!!!

猜你喜欢

转载自blog.csdn.net/m0_66780695/article/details/131013673
今日推荐