C语言学习笔记

1、各进制整型常量前缀:十进制(无),八进制(0),十六进制(0x或0X)

2、无符号整型后缀:u或U 长整型后缀:l或L

3、单字节有符号整数范围是-128~127,而不是-127~127

4、十进制实数在计算机中用二进制表示是有误差的

5、C语言中,实数常量只有十进制表示,实数常量的后缀是f或F,实数常量可以写作普通的小数形式,也可以写作“指数”形式,由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。

6、实数变量有两种:单精度(float)和双精度(double),在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

7、假设用一个n+1位字来表示一个定点数x,其中一位x0用来表示数的符号,其余位数代表它的量值。为了将整个n+1位统一处理起见,符号位x0放在最左位置,并用数值0和1分别代表正号和负号,这样,对于任意定点数x=x0x1x2...xn,在定点机中可表示为“ x0(符号)x1x2x3...xn(尾数).如果数x表示的是纯小数,那么小数点位于x0和x1之间,当x1x2...xn各位均为0时,数x的绝对值最小,即|x|min = 0;当各位均为1时,x的绝对值最大,即|x|max = 1 - (2的负n次方),故数的表示范围是0 <= |x| <= 1 - (2的负n次方)

关于为什么是1-(2的负n次方),可以以8位为例,算一下,按二进制小数转换为十进制的方法,各位均为1的小数要这样转换:
1*(2^-1) + 1*(2^-2) + ... + 1*(2^-7),也就是
1/2 + 1/4 + ... + 1/128
求和得到127/128,即 1 - 1/128,即1 - (2^-7)

8、当一个浮点数的尾数为0,不论其阶码为何值,或者当阶码的值遇到比它表示的最小值还小时,不管其尾数为何值,计算机都把该浮点数看成零值,称为机器零.

9、不是说浮点数就是小数,定点数也可以表示小数。把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示。这种把数的范围和精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。

10、按照IEEE的标准,32位短实数,符号位1位,阶码8位,尾数23位。对64位的长实数,符号位1位,阶码11位,尾数52位

11、实型常量不分单、双精度,都按双精度double型处理。即如 if (a == 0.0),这儿的0.0便默认是double类型

12、    float a;
    double b;
    a=33333.33333;
    b=33333.33333333333333;
    printf("%f %f ",a,b);

运行结果:

a:33333.332031,因为float只能提供7位有效数字,所以后面的2031实际上是无效的。(23个二进制有效数字位,转成10进制是7位数)

b:33333.333333,因为printf默认对float输出精确到6位小数,如果改成printf("%f %5.10f ",a,b);,则可以输出小数点后10位。double类型能提供16位有效数字

13、   int跟float运算结果默认是float类型

int i = 33;
    float j = 2.2;

    printf("%f", i*j); // 输出72.600002

printf("%d", i*j);//输出1828716544

14、标准输入中连续输入多个多位整数,以空格分开

	do
	{
		scanf("%d", &a[i++]);
	}while((c = getchar()) != '
');

// 这种方式是不行的,会导致第一个输入的字符不会被scanf获取到
// 	while((c = getchar()) != '
')
// 	{
// 		scanf("%d", &a[i++]);
// 	}
原文地址:https://www.cnblogs.com/any91/p/3346137.html