1.概述
基础类型:
- 整数(二进制数及其补码):char < short < int < long < long long1( 逻辑:bool)
- 浮点数(编码):float、double、long double
- 指针
自定义类型
2.类型的区别
1. 整数类型:(区分这么多,用int就够了)
- 计算机中的表达:我们以什么样的方式看待它
- 数的范围:
对于一个8位:00000000~11111111
11111111 ~ 10000000——> -1 ~ -128(我们当它是纯二进制数,就是255;当它是整数,它就是-1)
00000001 ~ 01111111——>1 ~ 127 - 整数的输入和输出:只有int 和long long 两种类型
%hd:short
%d:int;
%u:unsigned:
%ld:long long;
%lu:unsigned long long
int 字节数以下的变量如果用%u,超出最大二进制数即为int的-1 - 如果一个八进制数想要输出十进制,前面加0;十六进制前加0x。
- 如果想要输出八进制的数用%o,输出十六进制的数用%x(有字母出现,小x即输出小写字母,大X即输出大写字母)
2.浮点类型(没啥情况用double)
类型 | 字节 | 范围 | 有效数字 | 输入 | 输出 |
---|---|---|---|---|---|
float | 4 | 10^±38 0 ±inf(±无穷)nan(不是有效的数字) | 7 | %f | %f,%e(输出科学计数法) |
double | 8 | 10^±308 0 ±inf(±无穷)nan(不是有效的数字) | 15 | %lf | %f,%e |
- 科学计数法表示形式1^-10=1E-10
- 如果想要确定小数点位数,输出时采用“%.16f”,16表示想要保留的位数,遵循五舍六入
- 无穷大可以用浮点数表达,0.0可以做分母
- 浮点运算没有精度,不能比大小,如果非要比较大小用fabs(f1-f2)<1e-8 fabs表示取绝对值
- 带小数点的字面量是double而非float,如果想表达float,小数后面需要加f或F
- 浮点数的内部表达:编码形式:1bit表达±数,11bit表达指数部分是多少,后面bit 表达分数部分是多少,CPU中有专门的硬件
3.字符类型
- char(character):可以用单引号表示字符字面量、d=‘1’
- %c输入输出字符
- 输入字符“1”给char c
scanf(“%c”,&c);——>1
scanf(“%d”,&i);c=i;——>49 - 注意空格也是一个字符
- ASCII码
- 逃逸字符"比如双引号之间还想打双引号就用\加上”
4.逻辑类型
- bool:#include<stdbool.h>
之后可以使用true和false
3.运算
1.四则运算
加减乘除
2.关系运算
比较大小 注意==
3.赋值运算
4.逻辑运算
符号 | 含义 | 判断 | 举例 |
---|---|---|---|
! | 非 | !age<20 | |
&& | 与 | 有假则假 | 判断字符是否为大写字母c>=‘A’&&c<=‘Z’ |
11 | 或 | 有真则真 |
- 优先级!>&&> ||
- 短路:只要左边可以判断就不会做右边
所以不要把赋值和复合赋值写进表达式中
5.条件运算
- count = (count>20)? count-10 :count+10
条件?满足:不满足 - 不要用嵌套的条件表达式
6.逗号运算
- 优先级比赋值还低
- 在for 中使用eg:for(i=0,j=10;i<j;i++,j–)
小技巧
- sizeof()是一个j静态运算符(不参与运算),可以给出某个类型或者变量在内存中所占据的字节数。(1字节=8bit)
- if char c=255 不想以补码的形式输出-1,则前面需要添加unsigned (副作用:扩展了数的范围),if 一个字面量常数想要表达自己是unsigned——255U/u
补充
- CPU(Reg寄存器:宽代表字长:反映为int ,即int 就是用来表达寄存器的)——总线——RAM内存
- 补码:00000001+11111111(-1)=100000000(1多出来被丢掉=0)
对于a,其补码为0-a,2^n-a,n为类型的位数 - 补码的意义:拿补码和原码可以加出一个溢出的“0”。计算时可以把它当做一个纯二进制数进行计算。eg:127+1=-128;
- 强制类型转换:大转小(类型)值 eg:(int)10.2把double转为int.优先级高于四则运算
前三个黄色的是C99的类型 ↩︎