浮点数的存储
例题
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}
运行结果如下
unsigned int 类型大小是0~2^32,永远为正数,符合for循环的条件,当i为-1时,因为i为无符号类型,此时i的补码为11111111111111111111111111111111,
转化为十进制为4,294,967,295
例题
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
有符号型范围为-128~127
a[0]=-1
a[1]=-2
a[2]=-3
a[3]=-4
a[4]=-5
a[5]=-6
……
a[127]=-128
a[128]=127
……
strlen()函数是求\0之前的大小,\0的ASCII值为0,所以在0前共有255个
例题
unsigned char i = 0;
//范围为0~255
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
}//死循环
return 0;
}
接下来讲讲浮点型在内存中的存储
浮点型在内存中的存储和整形的存储是不一样的,它们是以以下形式存储的:
(-1)^S * M * 2^E
- S为0时,浮点数为正数;S为1时,浮点数为负数
- M存储有效数字,大小在1到2之间
- E为指数位
在32 位中,最高一位存储S,其次数8位存储E,剩余23位存储M
存入时:其中E为无符号整数,有时E为负数需要加中间数,中间数为127,例如为-3时,需要加127为124转化为二进制存入内存中。
取出时:E分为三种情况
- E不全为0或不全为1时,存储的值减去127即可,有效数字M加1
- E全为0时,有效数字不加1,数值接近0很小的数
- E全为1时,M全为0,数值无穷大
E不全为0或不全为1为主要情况,E全为0和E全为1这里不做过多了解
举个例子
5.5怎么存入内存当中
为正数,S为0
E为2+127=129,转换为二进制1000 0001
M减去1后为有效值存入,01100000000000000000000
整合
01000000101100000000000000000000
例题
int main()
{
int n = 9;
//00000000000000000000000000001001
//0 00000000 00000000000000000001001
//E全为0,1-127=-126
//0.00000000000000000001001接近0
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);//9
printf("*pFloat的值为:%f\n", *pFloat);//0.000000
*pFloat = 9.0;
//1001.0---1.001*2^3
//S=0,E=3+127=130,M=001
//0 1000 0010 00100000000000000000000
printf("num的值为:%d\n", n);//1,091,567,616
//01000001000100000000000000000000
printf("*pFloat的值为:%f\n", *pFloat);//9.000000
return 0;
}
以上就是对浮点数的总结,欢迎大家来指证错误