我正在做AP Comp Sci评论表,我不明白为什么编译时
System.out.println(365 * 24 * 3600 * 1024 * 1024 * 1024);
答案是0.我知道int是32位且最大值为2147483647并且无法给出3386152216166400,但为什么它不会出现溢出异常错误或类似错误?
答案 0 :(得分:1)
来自Java Language Specification,
整数运算符不表示任何溢出或下溢 方式。
这就是为什么你没有得到任何例外。
结果为specified by the language,如下所示,
如果整数乘法溢出,则结果为 一些数学产品的低阶位 足够大的二进制补码格式。结果,如果溢出 发生时,结果的符号可能与符号不一致 两个操作数值的数学乘积。
Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
Integer.MIN_VALUE - 1 == Integer.MAX_VALUE
这就是为什么结果为零的原因。
答案 1 :(得分:0)
只需添加L
即可确定其中一个值是基本类型long
:
System.out.println(365L * 24 * 3600 * 1024 * 1024 * 1024);
/* ^
* 'L' to indicate that one of the factors is long
*/
在Java中,所有数学都是以处理所需的最大数据类型完成的 所有当前值。所以,如果你有int * int,它将永远 将数学作为整数进行,但int * long以长整数形式完成。
在这种情况下,1024 * 1024 * 1024 * 80作为Int溢出完成 中间体
“L”当然会强制其中一个操作数为Int-64(长), 因此,所有的数学运算都将值存储为Long,因此没有 发生溢出。
修改强>
在许多情况下,Java基于C或C ++,它们基于 部件。溢出/下溢在C和C ++中几乎是无声的 在汇编时保持沉默(除非你检查特殊标志)。这很可能 由于C和C ++没有例外 首先提出。如果你想看到溢出/下溢你就是 使用了更大的类型。例如long long int或long double;)BTW组装 有类似于被称为陷阱或中断的异常, 溢出/下溢不会导致陷阱AFAIK。
归功于Peter Lawrey:https://stackoverflow.com/a/15998029/5645656
提示:有时使用谷歌可以在你提出问题之前回答你的问题。
答案 2 :(得分:0)
你必须使用BigInteger。
BigInteger bi1, bi2, bi3;
// assign values to bi1, bi2
bi1 = new BigInteger("123");
bi2 = new BigInteger("50");
// perform multiply operation on bi1 using bi2
bi3 = bi1.multiply(bi2);
String str = "Result of multiply is " +bi3;;
// print bi3 value
System.out.println( str );