Java 中的 int 范围错误

Range error for int in Java

对于以下值

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

先施

(count+currentPosition-1)

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

尝试:

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

这是 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

count 是一个 long,其值超出了 int.

的范围

转换应用于紧靠其右侧的(在本例中为带括号的)操作数。您可以想象演员表被括号括起来,如下所示:

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

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

你想要的是:

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