整形存储练习
该代码的结果???
#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:储存‘ . '后面的数,’ . ‘前面的要用的是侯在加上。
E是无符号整数(unsign int),E也可能是负数,当E=-1,
{fioat-->E(真实值)+127(中间值)-->126---储存}
{double-->E(真实值)+1023(中间值)-->1022---储存}
从内存中取出:
指数E从内存中取出分为三种情况:
- E不全为0或不全为1。{fioat-->E(真实值)+127(中间值)-->126---储存}
- E为全0(浮点数数的指数E=1~127(1~1023)即为真实值)
- 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;
}