在Java中仔细分配长值以避免溢出

如果在Java中具有整数值的运算,我们需要注意int下溢和溢出条件。考虑到以下事实:在Java中,int数据类型是32位带符号的二进制补码整数,最小值为-2,147,483,648,最大值为2,147,483,647。如果某个值超出可能的最大值,则该值将返回最小值并从该最小值继续。以类似的方式,它的值小于最小值。请看以下示例。

示例

public class Tester {
   public static void main(String[] args) {

      //方案1:
      //将int值分配给long导致溢出
      long MICROSECONDS_A_DAY = 24 * 60 * 60 * 1000 * 1000;

      System.out.println(MICROSECONDS_A_DAY);  
   
      //方案2:  
      //分配长值不会导致溢出
      MICROSECONDS_A_DAY = 24L * 60 * 60 * 1000 * 1000;

      System.out.println(MICROSECONDS_A_DAY);          
   }
}

输出结果

500654080
86400000000

要考虑的要点

  • 尽管我们使用了long变量,但在方案1中,乘法操作基于int,导致int溢出。结果,输出不正确。

  • 在方案2中,我们将乘法运算强制为基于所属的,从而得出正确的结果。