基本类型
c类型 | 16为机器 | 32位机器 | 64位机器 |
---|---|---|---|
char | 1 | 1 | 1 |
short | 2 | 2 | 2 |
int | 2 | 4 | 8 |
long | 4 | 8 | 8 |
long long | NA | 8 | 8 |
指针 | 2 | 4 | 8 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
long double | NA | 8 | 16 |
注:C语言规定 long double 长度大于等于double ,long long int 大于等于long int 大于等于 int 。 long long, long double是C99增加的类型,C99还增加了其他类型。 |
赋值运算
自动把“=”右边的表达式的类型转换成“=”右边的变量的类型
这个过程可能导致级别提升(被赋值的类型级别高)或者降级(被赋值的类型级别低),提升通常是一个平滑无损的过程,然而降级可能导致真正的问题
位移运算
左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。
C编译一般采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。
混合运算
依照以下转换规则
高 double ←← float
↑ ↑
↑ long
↑ ↑
↑ unsigned
↑ ↑
低 int ←← char,short
当出现在表达式中时,有符号和无符号的char和short类型都将自动转换为int,float型自动转换为double
在包含两种数据类型的任何运算中,较低级别类型将会转为运算中另一个较高级别的数据类型。
符号扩展
对于要扩展量为有符号数,扩展存储位数的方法。在新的高位字节使用当前最高有效位即符号位的值进行填充。
例1:
char a = 0xff; //有符号值为-1,二进制为11111111,其中最高位为符号位
short b = a; //b的有符号值为-1,在内存中存储的值为1111111111111111
例2:
char a = 1; //有符号值为1,二进制为00000001,其中最高位为符号位
short b = a; //b的有符号值为1,在内存中存储的值为0000000000000001
零扩展
对于要扩展量无符号数,扩展存储位数的方法。在新的高位直接填0.
例1:
unsigned char a=0xff; //二进制为11111111,所有值都是有效值
unsigned short b=a; //b经过零扩展后,内存中存储的值为0000000011111111
有符号数的转换规则
从 | 到 | 方法 |
---|---|---|
char | short | 符号位扩展 |
char | unsigned char | 最高位失去符号位意义,变为数据位 |
char | unsigned short | 符号位扩展到short;然后从short转到 unsigned short |
char | unsigned long | 符号位扩展到long; 然后从long 转到unsigned long |
char | float | 符号位扩展到long; 然后从long 转到float |
char | double | 符号位扩展到long; 然后从long 转到double |
char | long double | 符号位扩展到long; 然后从long 转到long double |
short | char | 保留低位字节 |
short | long | 符号位扩展 |
short | unsigned char | 保留低位字节 |
short | unsigned short | 最高位失去符号位意义,变为数据位 |
short | unsigned long | 符号位扩展到long; 然后从long转到unsigned double |
short | float | 符号位扩展到long; 然后从long 转到float |
short | double | 符号位扩展到long; 然后从long 转到double |
short | long double | 符号位扩展到long; 然后从long 转到double |
long | char | 保留低位字节 |
long | short | 保留低位字节 |
long | unsigned char | 保留低位字节 |
long | unsigned short | 保留低位字节 |
long | unsigned long | 最高位失去符号位意义,变为数据位 |
long | Float | 使用单精度浮点数表示。可能丢失精度。 |
long | double | 使用双精度浮点数表示。可能丢失精度。 |
long | long double | 使用双精度浮点数表示。可能丢失精度。 |
无符号数的转换规则
从 | 到 | 方法 |
---|---|---|
unsigned char | char | 最高位作为符号位 |
unsigned char | short | 0扩展 |
unsigned char | long | 0扩展 |
unsigned char | unsigned short | 0扩展 |
unsigned char | unsigned long | 0扩展 |
unsigned char | float | 转换到long; 再从 long 转换到float |
unsigned char | double | 转换到long; 再从 long 转换到double |
unsigned char | long double | 转换到long; 再从 long 转换到double |
unsigned short | char | 保留低位字节 |
unsigned short | short | 最高位作为符号位 |
unsigned short | long | 0扩展 |
unsigned short | unsigned char | 保留低位字节 |
unsigned short | unsigned long | 0扩展 |
unsigned short | float | 转换到long; 再从 long 转换到float |
unsigned short | double | 转换到long; 再从 long 转换到double |
unsigned short | long double | 转换到long; 再从 long 转换到double |
unsigned long | char | 保留低位字节 |
unsigned long | short | 保留低位字节 |
unsigned long | long | 最高位作为符号位 |
unsigned long | unsigned char | 保留低位字节 |
unsigned long | unsigned short | 保留低位字节 |
unsigned long | float | 转换到long; 再从 long 转换到float |
unsigned long | double | 直接转换成double |
unsigned long | long double | 转换到long; 再从 long 转换到double |