C的基本类型分为数值型(整型:short,int,long;实型:float,double,long double)和字符类型char 。
整型
整型分为 短整型short,整型int 和 长整型long。各类型占用字节数跟CPU位数相关
类型 | 16位CPU | 32位 | 64位 |
---|---|---|---|
int | 2 (btye) | 4 | 4 |
unsigned int | 2 (btye) | 4 | 4 |
short | 2 | 2 | 2 |
unsigned short | 2 (btye) | 2 | 2 |
long | 4 | 4 | 8 |
unsigned long | 4 | 4 | 8 |
一般现在使用的64位CPU。
unsigned 表示无符号,无符号数都是正值,值范围从 0 开始。
例如:
int 在64位CPU表示值范围为 [-2^31 , 2^31 - 1]
unsigned int 在64位CPU表示值范围为 [0, 2^32 - 1]
表示的数值个数都是 2^32
不同进制的数在C中的表示形式
2进制数以0b
或者0B
(不区分大小写)开头,如
int a = 0b101; //换算成十进制为 5
int b = -0b110010; //换算成十进制为 -50
int c = 0B100001; //换算成十进制为 33
复制代码
8进制数以0
开头,如
int a = 015; //换算成十进制为 13
int b = -0101; //换算成十进制为 -65
int c = 0177777; //换算成十进制为 65535
复制代码
16进制数以0x
或0X
(不区分大小写)开头,如
int a = 0X2A; //换算成十进制为 42
int b = -0XA0; //换算成十进制为 -160
int c = 0xffff; //换算成十进制为 65535
复制代码
在输出时,数值不能以2进制输出,只能以十进制,八进制,十六进制输出。输出符号为
short | int | long | |
---|---|---|---|
八进制 | %ho | %o | %lo |
十进制 | %hd | %d | %ld |
十六进制 | %hx 、%hX | %x、%X | %lx、%lX |
实型
实型分为,浮点型float,双精度型double,长双精度long double 。计算机存储小数精度有限,无法存很多很多位的小数
类型 | 占用字节 | 有效数字 |
---|---|---|
float | 4 (btye) | 6-7位 |
double | 8 | 15-16 |
long double | 16 |
输出符号为 %f
,默认是保留小数点后6位,设置 %.2f
可以保留小数点后两位。
float a = 3.14;
printf("%f -- %.2f\n", c,c); //打印结果为 3.140000 -- 3.14
复制代码
字符类型
字符类型char,只占用 1 个字节,因为 char 变量在内存中存储的是字符对应的 ASCII 码值,ASCII码值从 0 ~ 127 ,刚好可以用 1 个字节长度的二进制数表示。char 类型变量如果以 %c
输出,会根据 ASCII 码表转换成对应的字符;如果以 %d
输出,那么还是整数。
char a = 'A';
int b = a;
printf("%c -- %d\n", a,b); //打印结果为 A -- 65
复制代码
- 长字节的类型向短字节的类型赋值转换时,会发生截断,如 int -> char 时,会把 int 的低位字节保留,超过 char 长度的高位字节丢弃。
- 反过来则会发生扩展,把不足的字节补全,正数补0,负数补1
运算
不同类型进行运算时,会发生类型转换
- 短字节向长字节看齐
- 有符号向无符号看齐
- 整型向浮点型看齐
- 单精度向双精度看齐
先转换类型,再进行计算。
自增,自减
i++
和 ++i
,i--
和 --i
。 符号在后,则为运算前取值。符号在前,运算后取,即
int i = 0 ;
int j = i++ ; // i = 1, j = 0
复制代码
int i = 0 ;
int j = ++i ; // i = 1, j = 1
复制代码
int i = 0 ;
int j = i--; // i = -1, j = 0
复制代码
int i = 0 ;
int j = --i; // i = -1, j = -1
复制代码
自增自减只能对变量进行操作,不能对常量操作,比如 ++0
等是错误的
复合运算符
复合运算符是指 *=
、+=
、-=
等之类的运算符,向右组合。
int i = 0;
i += 2; // i = i + 2;
i *= 3; // i = i * 3;
printf("%d\n",i); // 6
复制代码