1.2 类型转换

C语言分栏目录

类型宽度
c 语言定义 long long int 宽度大于等于 long int 宽度 大于等于 int 宽度

同一类型根据编译器不同可能有不同宽度;一般情况下
1.2 类型转换

验证 :
1.2 类型转换
ppc64 GNU/Linux
1.2 类型转换

按照posix标准,一般整形对应的*_t类型为:
1字节 uint8_t
2字节 uint16_t
4字节 uint32_t
8字节 uint64_t

浮点数标准 :
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。
只有32位模式有强制要求,其他都是选择性的

赋值运算
自动把“=”右边的表达式的类型转换成“=”右边的变量的类型

这个过程可能导致级别提升(被赋值的类型级别高)或者降级(被赋值的类型级别低),提升通常是一个平滑无损的过程,然而降级可能导致真正的问题

混合运算
依照以下转换规则

高 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,其中最高位为符号位
shortb=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