在将 int 或 long 类型窄化转换为整数类型 T 的时候,转换过程仅仅是简单的丢弃除最低位N 个字节以外的内容,N 是类型 T 的数据类型长度,这将可能导致转换结果与输入值有不同的正负号(译者注:在高位字节符号位被丢弃了)。
在将一个浮点值转窄化转换为整数类型 T(T 限于 int 或 long 类型之一)的时候,将遵循以下转换规则: ? 如果浮点值是 NaN,那转换结果就是 int 或 long 类型的 0 ? 否则,如果浮点值不是无穷大的话,浮点值使用 IEEE 754 的向零舍入模式(§2.8.1) 取整,获得整数值 v,这时候可能有两种情况: ? 如果 T 是 long 类型,并且转换结果在 long 类型的表示范围之内,那就转换为 long 类型数值 v ? 如果 T 是 int 类型,并且转换结果在 int 类型的表示范围之内,那就转换为 int 类型数值 v ? 否则: ? 如果转换结果 v 的值太小(包括足够小的负数以及负无穷大的情况),无法使用 T 类 型表示的话,那转换结果取 int 或 long 类型所能表示的最小数字。 ? 如果转换结果 v 的值太大(包括足够大的正数以及正无穷大的情况),无法使用 T 类 型表示的话,那转换结果取 int 或 long 类型所能表示的最大数字。 从 double 类型到 float 类型做窄化转换的过程与 IEEE 754 中定义的一致,通过 IEEE 754 向最接近数舍入模式(§2.8.1)舍入得到一个可以使用 float 类型表示的数字。如果转换结果 的绝对值太小无法使用 float 来表示的话,将返回 float 类型的正负零。如果转换结果的绝对值 太大无法使用 float 来表示的话,将返回 float 类型的正负无穷大,对于 double 类型的 NaN 值将就规定转换为 float 类型的 NaN 值。 尽管可能发生上限溢出、下限溢出和精度丢失等情况,但是 Java 虚拟机中数值类型的窄化转 换永远不可能导致虚拟机抛出运行时异常(此处的异常是指《Java 虚拟机规范》中定义的异常, 请读者不要与 IEEE 754 中定义的浮点异常信号产生混淆)