Java算术计算结果的数据类型

7

在Java中,我知道算术计算结果的数据类型取决于参与计算的数字的数据类型。

  1. int + int = int

  2. long/double=double

a. 但我找不到可以给我所有这些规则的参考资料。有人能帮我吗?

b. 如何避免算术计算中的溢出?例如,2个long的结果可能无法再放入一个long中了...

非常感谢。

4个回答

4
a. 这些规则被称为数字提升规则,并在Java语言规范,§5.6.2 (目前)中指定。
b. 处理溢出的两种通常被接受的方法。
第一种方法是后检查,您执行一个操作,比如加法,然后检查结果是否大于任何一个操作数。例如:
int c = a + b;

if( c<a) {  // assuming a>=0 and b>=0
   // overflow happened
}

第二种方法是预检查,基本上是试图在第一时间避免发生溢出。例如:
if( a > Integer.MAX_INTERGER - b ) {
   // overflow happened
}

2
你的第一个检查并不总是有效的。如果b是负数,那么c < a将为真而不会溢出。 - Dan W
没错。我会把这个添加到例子中。但是我只是在说明方法,而不是提供一个万无一失的解决方案。 - Dmitry B.
是的,我知道那不是完整的解决方案。我只是想指出这一点,以免发布者将其视为逐字逐句的内容。 - Dan W

2

处理这些规则的Java语言规范的具体部分是第4节

如果您根本不希望值溢出,请使用BigInteger或其他任意精度算术类型。

为了在一般情况下避免溢出,Guava(我参与贡献)提供了像IntMath.checkedAdd(int, int)LongMath.checkedMultiply(long, long)这样的方法,它们在溢出时会抛出异常。(其中一些实现起来并不容易,但这些都经过了非常详尽的测试。)您可以查看源代码以了解它们的工作原理,但它们中的大多数都依赖于巧妙的位运算技巧,以有效地检查溢出。


1
任何两个原始整数操作数进行算术运算的结果将至少是一个int - 即使操作数是字节和短整型。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接