当我们使用java进行数据运算时,常常会因为没有选择好数据类型而导致到数据溢出,导致程序异常。
正常的数据自动转换
数值型数据转换:byte→short→int→long→float→double
字符型转换为整型:char→int
手动/强制转换
当我们在进行两个int
类型的计算时,通常会因为怕数据溢出而对运算结果进行一个手动类型转换。如下:
int b,c;
long a = (long)(b * c);
上述代码是正确的吗?仔细观察上述代码,有大部分人因为习惯或是一种错误的认知将(long)
后的式子用括号括起来,认为已经完成的类型转换并且用恰当的数据类型进行接收,现在明确的告诉你上述写法是错误的或者说是无用的。
正确写法如下:
int b,c;
long a = (long)b * c;
分析
让我们分析两种情况:
long a = (long)b * c;
在这种情况下,b
首先被强制类型转换为long
类型,然后与c
进行乘法运算。因为c
是int
类型,在运算时会自动提升为long
类型(如前所述,这是因为运算中涉及的另一个操作数是long
类型)。这样,运算就在long
的范围内进行,相对于int
类型,long
类型有更大的数值范围,这减少了溢出的可能性。
long a = (long)(b * c);
在这种情况下,b
和c
首先作为int
类型进行乘法运算。如果b
和c
的乘积超过了int
类型的最大值(),则会发生溢出,此时结果会被截断为一个不正确的int
值。只有在乘法运算完成后,这个已经可能溢出的结果才被强制类型转换为long
类型。因此,即使最终结果被赋给了一个long
类型的变量,如果在乘法运算时发生了溢出,这个错误的结果也无法被纠正。
总结
根据上述分析可知:long a = (long)(b * c);
更容易导致溢出,因为它允许在较小的int
类型范围内进行乘法运算,而不是在较大的long
类型范围内。为了避免溢出,应当优先使用long a =(long)b * c
写法。
© 版权声明
- 本博客所拥有的文章除特别声明外,均默认采用 CC BY 4.0 许可协议。
- 文章部分内容可能来源于公共网络,如有侵权,请联系博主在核实后进行修改或删除。
THE END
暂无评论内容