在内存中整数与浮点数的存储方式

整数

整数的 2进制表⽰⽅法 有三种,即原码、反码和补码

正整数的原、反、补码都相同。

负整数的三种表⽰⽅法各不相同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码

对于整形来说:数据存放内存中其实存放的是补码

浮点数

#include <stdio.h>
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);

上⾯的代码中, num 和 *pFloat 在内存中明明是同⼀个数,为什么浮点数和整数的解读结果会差别 这么⼤?

根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:

 V   =  (−1) ∗ S M ∗ 2E • (−1)S 表⽰符号位,当S=0,V为正数;

当S=1,V为负数 • M 表⽰有效数字,

M是⼤于等于1,⼩于2的 • 2 E 表⽰指数位

代码的解释

int main()// 难
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);//9
	printf("*pFloat的值为:%f\n", *pFloat);//0
	*pFloat = 9.0;
	//任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
	//V= (−1)^S M ∗ 2^E
	// (−1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
	// M 表⽰有效数字,M是⼤于等于1,⼩于2的
	// 2^E 表⽰指数位
	//1001 - 9的二进制位
	// 因为是正整数 所以 S =0;
	//1.001 -M  1<=M<2
	//1.001* 2^3 =9 所以 E = 3;
	//第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130,即10000010
	//写成⼆进制形式,应该是S+E+M,即 0 10000010 001 0000 0000 0000 0000 0000
	printf("num的值为:%d\n", n);//1091567616
	printf("*pFloat的值为:%f\n", *pFloat);//9
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dabai__a/article/details/133233370
今日推荐