正在看《C Primer Plus》,记下一些知识点:
- 位(bit),字节(byte),字(word)
1 bit只容纳1或者0;
1 byte = 8 bit,能表示0~255;
根据机器不同,我理解像通常说的32位和64位,指的就是1 word;
- 字符(char)
char类型保存在8 bit里,标准的ASCII范围是0~127,其实7 bit就够了;
char也可以分为signed char和unsigned char;
printf对应的是%c
C将字符常量视为int类型而非char类型,例如:
char grade = 'A' //将'A'作为数值65存到32bit单元中,赋值后将65存到8bit单元中
- int类型
1. c保证int至少有16bit长,unsigned定义无符号整数
2. 可移植的类型:inttypes.h,可以确切的定义int类型有多少位,没有细看,需要时再说
- float类型
1. float类型必须至少能表示6(8本机)位有效数字,取值范围10e-37~10e37,通常用32bit存一个float数,其中8bit表示指数及其符号,24bit表示非指数部分及其符号。
2. double类型至少能表示10(15本机)位有效数字,用64bit存一个double数。
3. 默认情况下,编译器将浮点常量当作double类型,例如:
float some = 4.0 * 2.0 //4.0和2.0被存储为double型,乘积运算使用double,结果截断为float。
//如果要将浮点常量设为float型,则写成4.0F或3.0f //保证了计算精度,但会减慢速度。
4. 上溢和下溢,NaN(not-a-number)
上溢:大到不能表示的数,用inf或infinity代替。
下溢:指数部分存储已经达到极限了,这时只能将非指数部分右移,就损失有效数字,降低了精度。
NaN:一些非正常的计算,例如/0,asin(1.2)等。
- printf的一个误解
float f = 1.f; int i = 1; printf("%d %f\n", f, i); //使用%d显示float值不会把float值转化为int,%f与之类似。
- printf的刷新输出
printf()函数先将内容传递给一个被称为缓冲区(buffer),然后再不断的传递给屏幕。
标准C规定在以下情况会将缓冲区的内容传递给屏幕:
(1)缓冲区满的时候;(2)遇到换行符的时候;(3)需要输入的时候;