数据的存储以及相关典型例题包括浮点数在内存中的存储详细讲解

数据的存储典例

例一

#include <stdio.h>
int main()
{
	int a = -20;
	unsigned int b = 10;
	printf("%d", a + b);
	return 0;
}

-20存入a中,存入补码,当计算a+b时a会算术转换unsigned int,但对于a来说即使转化为unsigned int,存入a中的数值不会发生改变,因为a的空间还是四个字节,而打印时要以%d的形式打印,所以要打印其补码,最后可以算出其为-10,若改成%u打印,把其看作是一个正数,即原码就是补码,会打印出一个超级大的数

例二

#include <windows.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
		Sleep(1000);

	}
	return 0;
}

由于i为unsigned int 类型,当i为负数时依然存的是补码,将其补码存入i中,站在i的角度看,i中存入的
会是一个超级大的数,例如-1,站在i的角度,存入的是全1,以%u打印的话就会打印全1,但以%d打印的话,补码转化原码,打印-1,但在i>0这个判断条件时,i依然是一个非常大的数与0比较,i恒大于0,所以会死循环

例三

int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}

由于char类型的范围是-128~127
从-1开始逐渐往数组a中存,当存到-128时,i++会变成127,在逐渐减小到0,而字符串的结束标志是’\0’,其ascii值为0,即遇到0截止,前面共255个数,输出255

例四

#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}

i的范围是0~255,当把256存入i中,截取后八位即全0,所以会死循环

浮点数在内存中的存储

浮点数并不像整形那样存储,它有一种特殊的存储方式
任意一个浮点数V都可以写成以下方式
(-1)^S * M * 2 ^E
S为0时,V为正数,S为1时,V为负数,M代表有效数字,E代表指数位
例如5.5可以写为(-1)^0 * 1.011 * 2 ^2
符号位S:0
有效数M:1.011
指数位 E:2
对于float类型来说,有32个比特位,1位是符号位,8位是指数位,剩下的23位是有效数
对于double类型来说,有64个比特位,1位是符号位,11位是指数位,剩下的52位是有效数
S位存0或1,代表正或负,E指数位只存指数,M可以写为1.xxxxxx,所以存的是小数点后面的数
到时候输出的时候缺的值会自动补回来
但有些浮点数不能精确保存,比如5.3存入一个float类型中,那存入的值为5.30000019,因为5.3中小数点后边的3转化为2进制始终是差一点点才凑为3,结果有效数只能存23位,所以会有误差
对于存入指数E来说,E为一个无符号整数
对于float类型E的取值范围是0~255, 对于double类型E的取值范围是0 ~ 2^11 - 1,但是若是把0.5存入的话
会转化为(-1)^01.0(2 ^ -1),E为-1,所以对于8位数的E,存入E的真实值必须加一个中间数127,对于11位数E,存入的E的真实值必须加1023
对于取出指数E来说,分为三种情况
1.E不全为0或不全为1
E的值减去127或1023,得到真实的指数
2.E全为0时
这时表示+/-1.xxxxx2^-127,这是趋于0的数字,此时我们直接把E解析为1-127(1-1023),M还原为0.xxxx
3.E全为1时
这时表示+/- 1.xxxxxx
2^128,这是一个非常大的数字

浮点数内存存储的典型例题

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);
return 0;
}

以整形的视角将9存入,原反补码是00000000000000000000000000001001
若以float类型的视角取出的话, S:-1,M:00000000000000000001001,E:00000000,所以指数直接还原为1-127,M为0.00000000000000000001001,所以会打印9,0.000000
对于将9.0存入以浮点数的视角存入n中,9转化为(-1)^01.0012 ^3在内存中存入的是
0 00000011 00100000000000000000000
将它以整数的视角取出,则是一个很大的数
将它以float类型视角取出,那么就将其还原回去,(-1)^01.0012 ^3,打印出来即为9.000000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值