【发布时间】:2012-04-16 10:32:33
【问题描述】:
在java中,我知道算术计算结果的数据类型取决于计算中涉及的数字的数据类型。 例如,
int + int = int
long/double=double
一个。但我找不到任何可以给我所有这些规则的参考资料。有人可以帮我吗?
b.如何避免算术计算中的溢出?例如,2 long 的结果可能不再适合 long...
非常感谢。
【问题讨论】:
标签: java math type-conversion
在java中,我知道算术计算结果的数据类型取决于计算中涉及的数字的数据类型。 例如,
int + int = int
long/double=double
一个。但我找不到任何可以给我所有这些规则的参考资料。有人可以帮我吗?
b.如何避免算术计算中的溢出?例如,2 long 的结果可能不再适合 long...
非常感谢。
【问题讨论】:
标签: java math type-conversion
一个。这些规则称为数值提升规则,在Java Language Specification, §5.6.2 (currently) 中指定。
b.处理溢出有两种普遍接受的方法。
第一种方法是后检查,您可以在其中执行操作,例如加法,然后检查结果是否大于任一操作数。例如:
int c = a + b;
if( c<a) { // assuming a>=0 and b>=0
// overflow happened
}
第二种方法是预先检查,您基本上首先尝试避免溢出发生。示例:
if( a > Integer.MAX_INTERGER - b ) {
// overflow happened
}
【讨论】:
c < a 将为真而不会溢出。
Java 语言规范中处理这些规则的特定部分是section 4。
如果您根本不希望值溢出,请使用 BigInteger 或其他任意精度的算术类型。
为了在一般情况下避免溢出,Guava(我参与其中)提供了像 IntMath.checkedAdd(int, int) 和 LongMath.checkedMultiply(long, long) 这样的方法,它们在溢出时抛出异常。 (其中一些您自己实现起来并不简单,但这些都经过了非常详尽的测试。)您可以查看源代码以了解它们是如何工作的,但它们中的大多数依赖于可爱的小技巧来有效地检查溢出。
【讨论】:
对任何两个原始整数操作数进行算术运算的结果将至少是一个 int -- 即使操作数是字节和短整数。
【讨论】:
问题 A 的答案:
具有“较大类型”的操作数的类型
Double 是“最大”的类型
注意:char 和 boolean 不能与算术运算符一起使用
来源:https://www.geeksforgeeks.org/type-conversion-java-examples/
【讨论】: