【问题标题】:Range error for int in JavaJava中int的范围错误
【发布时间】:2015-02-09 08:18:43
【问题描述】:

对于以下值

long Count = 2151685171
int CurrentPosition = 849
int employeesLeft = 1276

下面的代码抛出 indexOutOfBound 错误:

int EmployeeToBeEliminated = (int)(count+currentPosition-1)%employeesLeft;

如果这样写

count = (count+currentPosition-1)%employeesLeft;
int EmployeeToBeEliminated = (int)count;

没有抛出错误。但是在第一种情况下,取模后的值减小到01276的范围内,所以应该很容易将其转换为int。那么为什么会抛出错误呢?

【问题讨论】:

  • 检查 Integer.MAX_INT 和自动装箱:在第一种情况下,所有值都转换为 int,而在第二种情况下,所有值都转换为 long。
  • 您包含的代码不会引发 IndexOutOfBoundsException。您可能有一些代码使用EmployeeToBeEliminated 作为某个集合/数组的索引。
  • 您的变量名为Count,但您在代码中使用countcurrentPosition 也一样。

标签: java casting int


【解决方案1】:

count 是一个long,其值超出了int 的范围。

强制类型转换应用于紧邻其右侧的(在本例中为括号内的)操作数。你可以想象演员阵容是这样用括号括起来的:

( (int)(count+currentPosition-1) ) %employeesLeft

(count+currentPosition-1) 的结果转换为int 会导致溢出。

你想要的是:

(int)( (count+currentPosition-1)%employeesLeft )

【讨论】:

    【解决方案2】:

    这是 Java 中运算符优先级的问题。

    在第一个代码示例中,代码按以下顺序处理:

    1. (int)(count+currentPosition-1)
    2. Result from 1 %employeesLeft;

    在第二个代码示例中,代码按以下顺序处理:

    1. (count+currentPosition-1)%employeesLeft;
    2. (int) Result from 1

    为了得到同样的结果,第一个代码示例应该写成:

    int EmployeeToBeEliminated = (int)((count+currentPosition-1)%employeesLeft);

    注意添加的新括号。

    参考:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

    【讨论】:

      【解决方案3】:

      它首先投射

      (count+currentPosition-1)
      

      到 int,它打破了 int 的 +2.147.483.647 界限,然后尝试取模。

      试试:

      int EmployeeToBeEliminated = (int)((count+currentPosition-1)%employeesLeft);
      

      【讨论】:

      • 它是一个 int 但因为它将 long 转换为 int(对于 int 来说正值太大,所以转换使其为负)。当您将负数与正数相乘时,您的结果就是负数
      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 2015-04-03
      • 2012-08-21
      • 2015-05-07
      • 2018-04-08
      • 2014-03-02
      相关资源
      最近更新 更多