在Java中,我知道算术计算结果的数据类型取决于参与计算的数字的数据类型。
int + int = int
long/double=double
a. 但我找不到可以给我所有这些规则的参考资料。有人能帮我吗?
b. 如何避免算术计算中的溢出?例如,2个long的结果可能无法再放入一个long中了...
非常感谢。
在Java中,我知道算术计算结果的数据类型取决于参与计算的数字的数据类型。
int + int = int
long/double=double
a. 但我找不到可以给我所有这些规则的参考资料。有人能帮我吗?
b. 如何避免算术计算中的溢出?例如,2个long的结果可能无法再放入一个long中了...
非常感谢。
int c = a + b;
if( c<a) { // assuming a>=0 and b>=0
// overflow happened
}
if( a > Integer.MAX_INTERGER - b ) {
// overflow happened
}
处理这些规则的Java语言规范的具体部分是第4节。
如果您根本不希望值溢出,请使用BigInteger
或其他任意精度算术类型。
为了在一般情况下避免溢出,Guava(我参与贡献)提供了像IntMath.checkedAdd(int, int)
和LongMath.checkedMultiply(long, long)
这样的方法,它们在溢出时会抛出异常。(其中一些实现起来并不容易,但这些都经过了非常详尽的测试。)您可以查看源代码以了解它们的工作原理,但它们中的大多数都依赖于巧妙的位运算技巧,以有效地检查溢出。
Double是“最大”的类型
注意:char和boolean不能与算术运算符一起使用
来源:https://www.geeksforgeeks.org/type-conversion-java-examples/
c < a
将为真而不会溢出。 - Dan W