C++的数据类型也可以按等级排名。如果一个数字数据类型可以容纳的数字大于另一个数据类型,那么它的排名就高于后者。例如,float 类型就超越了 int 类型,而 double 类型又超越了 float 类型。下表列出了从高到低排列的数据类型。
long double |
double |
float |
unsigned long long int |
long long int |
unsigned long int |
long int |
unsigned int |
int |
表 中排名的一个例外是当 int 和 long int 的大小相同时。在这种情况下,unsigned int 将超越 long int,因为它可以保存更高的值。
整数转浮点数
小数部分记为0,整数部分保留,但可能有精度损失 。(如:浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分记录最高的有效位,当整数的有效位数超过浮点数的尾数时,有可能会舍弃一部分精度)
浮点数转整数
小数部分舍弃,整数部分保留。但是当整数部分大于int的范围时,会发生溢出。
有符号转无符号
从二进制表示上看二者没有区别。但是有符号数和无符号数的最高位表示不同,所以负数转为无符号 = 2^32 - 负数的绝对值
无符号数转有符号
同理,从二进制表示上看二者没有区别。最高位为1时溢出,变为负数,= - (uint - 2^31)
整型之间的转换
有符号数,符号位不变,多了裁剪高位,少了高位补零
无符号数,多了裁剪高位,少了高位补零
浮点数之间的转换
float转double,既不会溢出也不会损失精度
double转float,可能会溢出,也可能会损失精度
大小不同的符号数和无符号数之间的转换,先按规则转换大小,再按规则转换符号。
总结:位数不同的转换采用补零和舍弃的方式,有无符号的转换本质是二进制不变的转换,整型浮点型的转换是舍弃小数,保留整数位的转换。