Java中int的范围错误

时间:2015-02-09 08:18:44

标签: java casting int

以下值

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。那么为什么会抛出错误?

3 个答案:

答案 0 :(得分:1)

countlong,其值超出int范围。

强制转换应用于其右侧的(在本例中为括号)操作数。您可以想象演员阵容的括号如下:

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

(count+currentPosition-1)的结果投射到int会导致溢出。

你想要的是:

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

答案 1 :(得分:0)

首先施展

(count+currentPosition-1)

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

尝试:

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

答案 2 :(得分:0)

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

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

  1. (int)(count+currentPosition-1)
  2. Result from 1 %employeesLeft;
  3. 在第二个代码示例中,代码按以下顺序处理:

    1. (count+currentPosition-1)%employeesLeft;
    2. (int) Result from 1
    3. 要获得相同的结果,第一个代码示例应写为:

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

      注意添加了新的括号。

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