窄化类型转换
2021-08-30 本文已影响0人
Shaw_Young
窄化类型转换(Narrowing Numeric Conversion)
1.转换规则
Java虚拟机也直接支持以下窄化类型转换:
- 从int类型至byte、short或者char类型。
对应的指令有:i2b、i2s、i2c
- 从long类型到int类型。
对应的指令有:l2i
- 从float类型到int或者long类型。
对应的指令有:f2i、f2l
- 从double类型到int、long或者float类型。
对应的指令有:d2i、d2l、d2f
2.精度损失问题
窄化类型转换可能会导致转换结果具备不同的正负号、不同的数量级,因此,转换过程很可能会导致数值丢失精度。
尽管数据类型窄化转换可能发生上限溢出、下限溢出和精度丢失等情况,但是Java虚拟机规范中明确规定数值类型的窄化转换指令永远不可能导致虚拟机抛出运行时异常。
3.补充说明
3.1当将一个浮点值窄化转换为整数类型T(T限于int或者long类型之一)的时候,将遵循以下转换规则:
- 如果浮点值是NaN,那转换结果就是int或者long类型的0。
- 如果浮点值不是无穷大的时候,浮点值使用IEEE 754的向零舍入模式取整,获得整数值v,如果v在目标类型T(int或long)的表示范围之内,那转换结果就是v。否则,将根据v的符号,转换为T所能表示的最大或者最小正数
3.2 当将一个double类型窄化转换为float类型时,将遵循以下转换规则:
通过向最接近数舍入模式舍入一个可以使用float类型表示的数字。最后结果根据下面3条规则判断:
- 如果转换结果的绝对值太小而无法使用float来表示,将返回float类型的正负零。
- 如果转换结果的绝对值太大而无法使用float来表示,将返回float类型的正负无穷大。
- 对于double类型的NaN值将按规定转换为float类型的NaN值。
梦想很模糊,去追,它会渐变清晰。青春励志,奋斗下去别放弃。