1。c语言可移植类型:stdint.h 和 inttypes.h
#include<stdio.h>
#include<inttypes.h>
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。程序中的警告,表示的意思为:尽管编写的代码有效,但有可能不是程序猿想要的
3。计算机把浮点数分成小数部分和指数部分来表示
在计算机中将浮点数按照IEEE754标准来存储
我们在将一个浮点数进行存储时,先将其转换成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<stdio.h>
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
下图为双精度数在内存中的存储方式
3。c标准对基本数据类型只规定了允许的最小大小
4。c编译器在存储short的时候自动将short的值转化成int类型的值。因为int类型的值被认为是计算机处理整数类型时最高效的值。
5。char是8bit,所以如果像下面这样赋值的话
char c = 'ASD';
printf("%c\n", c);
结果为:D
想把24bit存到8bit中,8bit后面的字符会覆盖前面的,所以最后打印出来的结果只是D
6。 八进制和十六进制都是 unsigned int 类型 用%u来打印
2.0e30是double类型 科学计数法的数可以用%e来将其打印出。
7。负数的存储方式:取反加1
int a = -234
将234其转换成二进制形式,然后用比它多一位的九位数10000000 减去234的二进制形式就是-234的存储形式。
也就是传说中的:取反加一
编程练习:
一年大约有3.156*10^7秒。编程提示用户输入身高,然后以厘米为单位显示身高
#include<stdio.h>
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;
}