数据类型强制转换(无符号与有符号,短字节和长字节(double转int),float转int等)

目录

  • 定义
  • 1. 无符号数和有符号数
  • 2. 短字长数和长字长数(如short和int)
    • 2.1 短转长
    • 2.2 长转短
  • 3. 特殊(int和float)
  • 总结

定义

数据类型强制转换(无符号与有符号,短字节和长字节(double转int),float转int等)_第1张图片

1. 无符号数和有符号数

核心思想:位模式不变
方法一:先转为二进制串,再分别按位串转无符号数(或有符号数)的定义转化


方法二:采用公式直接计算
补码转无符号数
数据类型强制转换(无符号与有符号,短字节和长字节(double转int),float转int等)_第2张图片

2. 短字长数和长字长数(如short和int)

2.1 短转长

核心思想:高位扩展并保证短和长的真值相同
方法:无符号数高位添0,有符号数进行符号位扩展

2.2 长转短

核心思想:截断,溢出
方法:

  1. 整数->整数(long->int):先丢弃高位(即取模),再采用B2U或B2T
  2. 浮点数(double->float):溢出或丢失精度
  3. 浮点数->整数(double->int):溢出或截断小数部分

3. 特殊(int和float)

int->float:int损失精度,因为float总是近似值(只有6位有效数字),而int是准确值
float->int:

  1. float值小于int能表示范围时,小数部分被截断,只保留整数部分;
  2. float值超过int表示范围,发生溢出,具体策略视编译器而定(在gcc中,若溢出,则采用INT_MAX(或INT_MIN))

总结

  1. 无符号数与有符号数的真值差异非常大,当表达式中含有无符号数时,表达式中的有符号数会被T2U,这时程序容易存在安全隐患,因此要避免无符号数的使用
  2. 长字长数转短字长数会丢失精度和溢出(如double->float, int->short)
  3. 短字长数转长字长数不会丢失数据精度,因为其核心思想是保证真值相同,

你可能感兴趣的:(数据类型强制转换(无符号与有符号,短字节和长字节(double转int),float转int等))