C/C++常用数据类型的转换

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,可能会溢出,也可能会损失精度

大小不同的符号数和无符号数之间的转换,先按规则转换大小,再按规则转换符号。

总结:位数不同的转换采用补零和舍弃的方式,有无符号的转换本质是二进制不变的转换,整型浮点型的转换是舍弃小数,保留整数位的转换。

猜你喜欢

转载自blog.csdn.net/qq_55796594/article/details/129320928