数据在内存中的存储2

浮点数在内存中的存储

数据在内存中的存储2_第1张图片

数据在内存中的存储2_第2张图片

 由此容易看出 整型 和 浮点数 类型在 内存 中的 数据存储 的方式有差异

任何一个浮点数都可以这样表示

数据在内存中的存储2_第3张图片数据在内存中的存储2_第4张图片

 数据在内存中的存储2_第5张图片数据在内存中的存储2_第6张图片

  S决定正负,M是科学计数法表示的大于等于1小于2的小数,E代表缩写的二进制位数

 知道S,M,E的值,就能还原一个浮点数,因此存储的时候就是存储S,M,E

怎么存?

S的值是0或1

对M的规定:

数据在内存中的存储2_第7张图片

舍弃一个默认的1,多保存一位有效数字,在读取的时候加上第一位1

 对E的规定:

数据在内存中的存储2_第8张图片

 科学计数法中可以出现负数,但内存中E为无符号整数(恒为正),因此存入E时候要加上127(32位),1023(64位double)以保证存入的数为正,读取的时候减去对应值

数据在内存中的存储2_第9张图片

 数据在内存中的存储2_第10张图片

 浮点数在内存中存储方式的证明

数据在内存中的存储2_第11张图片

怎么取?

分为3种情况

数据在内存中的存储2_第12张图片

数据在内存中的存储2_第13张图片因为是一个非常小的数字, 浮点数的E为-126或者-1022,有效数字M前面补0.而不再补1.

 举例:

int main()
{
	int n = 9;
	//直接以整型形式存放在内存中
	//00000000000000000000000000001001
	// 当被*pFloat(浮点数类型)访问时候,存放的内容被认为是浮点数
	//0 00000000 00000000000000000001001
	//S E        M
	//0 -126     0.00000000000000000001001(E全为0的情况,真实值E为-126(-1022),M前补0.
	//(-1)^0*0.00000000000000000001001*2^-126
	float* pFloat = (float*)&n;
	printf("n的值为%d\n", n);
	printf("*pFloat的值为%f\n", *pFloat);
	//只打印小数点后面六位,因此为0.000000

	*pFloat = 9.0;
	//以浮点数形式存放内存中
	//1001.0
	//科学计数法
	//1.001* 2^3
	//-1^0 * 1.001 * 2^3
	//S=0    E=1.001 M=3(3+127)
	//0 10000010 00100000000000000000000
	printf("num的值为%d", n);
	//以十进制整型形式打印
	//0 1000001000100000000000000000000(符号位为0,正数,原码和补码相同
	//直接计算得结果1091567616
	printf("*pFloat得值为%f", *pFloat);
	//以浮点数存,浮点数取,则值不变
	return 0;
}

 

你可能感兴趣的:(c语言)