c笔记1
1.各变量类型所占内存大小(单位:字节)
16位编译器 | 32位编译器 | 64位编译器 | |
---|---|---|---|
char | 1 | 1 | 1 |
char* | 2 | 4 | 8 |
short int | 2 | 2 | 2 |
int | 2 | 4 | 4 |
unsigned int | 2 | 4 | 4 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
long | 4 | 4 | 8 |
long long | 8 | 8 | 8 |
unsigned long | 4 | 4 | 8 |
1).long long 为C99标准下表达方式
2).sizeof()
2.输出时的格式化
int ------ %d
long ------ %ld
double ------ %lf
3.所表达数的范围
char < short < int < float < double
4.补码
1). 11 111 111在十进制下为255,亦即一个字节可表达的最大十进制数字;
2). 11 111 111在作为补码时为-1,因为11 111 111+1=100 000 000,但每个字节只能容纳8比特的数字,所以第九位,即结果的首位数一,会因为溢出而被丢弃,如此最后的结果便为0.补码的意义就是拿补码和源码可以加出一个溢出的“零”。
5.unsigned
1). 加在变量类型前,表示不以补码形式表示负数,表示该变量无负数部分,最小为0。
2). 如果一个字面量常数想表达自己是unsigned,可以在后面加u或U(如255u);如果一个字面量常数想表达自己是long,可以在后面加l或L。
6.整数的输入输出
1). 只有两种形式:int 或long long
- %d : int
- %u : unsigned
- %ld : long long
- %lu : unsigned long long
7.八进制和十六进制
1). 八进制的数字为0开头
2). 十六进制的数字为0x开头
3). %d输出为十进制,%o可以输出八进制,%x可以输出十六进制,%x输出结果中的字母为小写,%X输出结果中的字母为大写
8.浮点数
1). double和float在极其接近0的位置是无法表示的,但可以表达无穷(inf),也可以表达不存在一个数字(nan)。
2).
scanf | printf | |
---|---|---|
float | %f | %f,%e |
double | %lf | %f,%e |
3). 指定输出多少位小数
在%和f之间加“.位数”即可,例如:
printf("%.4f\n",number)
结果为保留四位小数的浮点数number,注意输出会自动四舍五入
4). 浮点数的计算是没有精度的,带小数点的字面量是double而不是float,需要表明为float时加“f”后缀;要确认两个浮点数相等时,使用“==”可能失败,最好使两个浮点数相减取绝对值,结果小于某个精度值(例如10-8或者10-10)即可
5) 浮点数的内部表达
以编码形式存在,一个比特表达正负,一部分比特用来表达指数部分,一部分用来表达它的分数部分,它并不会用完所有的位数。浮点数一般由专门的硬件计算。如无特殊需要,只需用double。
sign | exponent | fraction |
---|---|---|
1 bit | 11 bit | 52bit |
9.字符
1). 字符字面量由单引号’ '表示
2). printf和scanf使用%c来输入输出字符
3). 字符和数字通过ASCII码对应
4). scanf不能读进char,需要中转
5). scanf读入字符,中间加不加空格是有区别的
6). ‘a’ - ‘A’ 可以得到两段之间的距离,所以
- a + ‘a’ - ‘A’ 可以把一个大写字母变成小写字母
- a + ‘A’ - ‘a’ 可以把一个小写字母变成大写字母
7). 逃逸字符
若要表示 ",则需要在其之前加反斜杠 ”\“
如\b(回退),\t(对齐,制表位),\r(回车)
10.类型转换
1). 对于printf,任何小于int的类型会被转为int;float会被转为double
2). scanf与printf不同,scanf要求后面变量的类型明确,要输入short,需要%hd
3). 强制转换
(类型)值,如:
- (int)10.2 表示将10.2转为int类型
注意存在安全性问题
注意强制类型转换是产生了新的值,原变量不变
强制类型转换的优先级高于四则运算