定义
1. 无符号数和有符号数
核心思想:位模式不变
方法一:先转为二进制串,再分别按位串转无符号数(或有符号数)的定义转化
方法二:采用公式直接计算
2. 短字长数和长字长数(如short和int)
2.1 短转长
核心思想:高位扩展并保证短和长的真值相同
方法:无符号数高位添0,有符号数进行符号位扩展
2.2 长转短
核心思想:截断,溢出
方法:
- 整数->整数(long->int):先丢弃高位(即取模),再采用B2U或B2T
- 浮点数(double->float):溢出或丢失精度
- 浮点数->整数(double->int):溢出或截断小数部分
3. 特殊(int和float)
int->float:int损失精度,因为float总是近似值(只有6位有效数字),而int是准确值
float->int:
- float值小于int能表示范围时,小数部分被截断,只保留整数部分;
- float值超过int表示范围,发生溢出,具体策略视编译器而定(在gcc中,若溢出,则采用INT_MAX(或INT_MIN))
总结
- 无符号数与有符号数的真值差异非常大,当表达式中含有无符号数时,表达式中的有符号数会被T2U,这时程序容易存在安全隐患,因此要避免无符号数的使用
- 长字长数转短字长数会丢失精度和溢出(如double->float, int->short)
- 短字长数转长字长数不会丢失数据精度,因为其核心思想是保证真值相同,