数据存储——练习+浮点型存储

整形存储练习 

 

该代码的结果???
#include <stdio.h>
#include <Windows.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
		Sleep(1000);
	}
	//i=-1
	//10000000 00000000 00000000 00000001
	//11111111 11111111 11111111 11111110
	//11111111 11111111 11111111 11111111
	//i=-2
	//10000000 00000000 00000000 00000010
	//11111111 11111111 11111111 11111101
	//11111111 11111111 11111111 11111110
	return 0;
}
int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	//arr[i]-->char -128~127
	//-1 -2 -3 -4 .... -1000
	//-1 -2 ...-128 127 126 125...3 2 1 0 -1
	printf("%d", strlen(a));//128+127=255
	//strlen 是求字符串的长度,关注的是字符中‘\0’(数字0)之前出现多少字符
	return 0;
}

int main()
{
	/*int len = strlen("abcdef");
	printf("%d\n", len);*/
	//size_t -->unsigned int
	//strlen 返回类型是:size_t
	if (strlen("abc") - strlen("abcdef") >= 0)
	{
		printf("%d", strlen("abc") - strlen("abcdef"))
		printf(">\n");
	}
	else
		printf("<\n");
	return 0;
}
int mian()
{
	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;
}

浮点型存储

浮点数表示的范围:float.h中定义

整数表示的范围:limits.h中定义

浮点型存储:

二进制浮点数V可以表示为:

  • (-1)^S*M*2^E
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • M表示有效数字,大于等于1,小于等于2。
  • 2^E表示指数位

举例说明:

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

V=5.0f(f-->表示float)-----101.0(科学计数---1.01*2^2(2表示二进制2表示' . '往前移了两位

 =(-1)^0*1.01*2^2

S=0        m=1.01        E=2

V=9.5f        =1001.1        =1.0011*2^3        =(-1)^0*10011*2^3        S=0  M=1.0011  E=3

1001.101[2^(-1)  2^(-2)  2^(-3)]{有的时候算不出来 ——9.6f会发生精度丢失}--->小数,浮点数无法精确保存。

float在内存中的储存:

                                       ———— 存 S M E

关于M:储存‘.'后面的数,’  .  ‘前面的要用的是侯在加上

关于M:储存‘ . '后面的数,’  .  ‘前面的要用的是侯在加上。 

E是无符号整数(unsign int),E也可能是负数,当E=-1,

{fioat-->E(真实值)+127(中间值)-->126---储存}

{double-->E(真实值)+1023(中间值)-->1022---储存}

从内存中取出:

指数E从内存中取出分为三种情况:

  1. E不全为0或不全为1。{fioat-->E(真实值)+127(中间值)-->126---储存}
  2. E为全0(浮点数数的指数E=1~127(1~1023)即为真实值)
  3. E为全1(如果有效数字M全为0,表示+-无穷大(正负取决于符号位S))

 一个例子:

int mian()
{
	int n = 9;
	//00000000 00000000 00000000 00001001
	// 
	//0 0000000 000000000000000000001001
	//E=-126 M=0.000000000000000000001001
	//+0.000000000000000000001001*2^-126
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);//9

	printf("*pFloat的值为:%f\n", *pFloat);//0.0000

	*pFloat = 9.0;
	//1001.0
	//1.001*2^3
	//s=0 E=3 M=1.001
	//0 10000010 001000000000000000000000
	//0 10000010 001000000000000000000000--n位正数
	printf("num的值为:%d\n", n);//
	printf("*pFloat的值为:%f\n", *pFloat);//9.0
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值