#include
#include
int main(int argc, char const *argv[])
{
int32_t me32;
scanf("%"SCNd32,&me32);
printf("me32 = %d\n", me32);
printf("me32 = %" PRId32 "\n", me32 );
return 0;
}
我们在将一个浮点数进行存储时,先将其转换成2进制的浮点数表示形式,随后按照图中的部位分别来进行存储。
如 float a = 3.5 这里机器中float存储为32位,所以
IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
我们的3.5转化成二进制为11.1 = 1.11 * 2^1
则s = 0
由于M在存储的时候,规格化的浮点数要求1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。
则M = 11
E的话,首先其为无符号数,但是转化成二进制科学计数法的时候其E可能出现负数,所以需要加上一个中间值,32位数加上127,64位加上1023
则E = 1+127 = 128
所以存储的为
0 10000000 11000000 00000000 0000000
我们用程序来验证一下内存中是否是这样存储的
#include
int main(int argc, char const *argv[])
{
float a = 3.5;
printf("float = %zd\n",sizeof(float));
char *p = (char*) &a;
printf("%d\n", *p);
printf("%d\n", *(p+1));
printf("%d\n", *(p+2));
printf("%d\n", *(p+3));
return 0;
}
000000000 00000000 011000000 01000000
转化成十进制正好为 0 0 96 64
下图为双精度数在内存中的存储方式
char c = 'ASD';
printf("%c\n", c);
结果为:D
想把24bit存到8bit中,8bit后面的字符会覆盖前面的,所以最后打印出来的结果只是D
2.0e30是double类型 科学计数法的数可以用%e来将其打印出。
int a = -234
将234其转换成二进制形式,然后用比它多一位的九位数10000000 减去234的二进制形式就是-234的存储形式。
也就是传说中的:取反加一
编程练习:
一年大约有3.156*10^7秒。编程提示用户输入身高,然后以厘米为单位显示身高
#include
int main(int argc, char const *argv[])
{
long double a = 3.156e7;
long double minutes ;
int age;
scanf("%d",&age);
minutes = a * age;
printf("%Le\n", minutes);
return 0;
}