在java

时间:2017-12-28 17:03:47

标签: java int multiplication primitive-types system.out

我正在做AP Comp Sci评论表,我不明白为什么编译时

System.out.println(365 * 24 * 3600 * 1024 * 1024 * 1024);答案是0.我知道int是32位且最大值为2147483647并且无法给出3386152216166400,但为什么它不会出现溢出异常错误或类似错误?

3 个答案:

答案 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,因此没有   发生溢出。

     

归功于Erich:https://stackoverflow.com/a/1494884/5645656

修改

  

在许多情况下,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 );