以下值
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;
没有抛出错误。但在第一种情况下,在将模数值降低到0
到1276
的范围之后,应该很容易将其转换为int
。那么为什么会抛出错误?
答案 0 :(得分:1)
count
是long
,其值超出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中运算符优先级的问题。
在第一个代码示例中,代码按以下顺序处理:
(int)(count+currentPosition-1)
Result from 1 %employeesLeft;
在第二个代码示例中,代码按以下顺序处理:
(count+currentPosition-1)%employeesLeft;
(int) Result from 1
要获得相同的结果,第一个代码示例应写为:
int EmployeeToBeEliminated = (int)((count+currentPosition-1)%employeesLeft);
注意添加了新的括号。
参考文献:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html