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;
没有抛出任何错误。但是在第一种情况下,取模后取值缩小到0
到1276
的范围,所以应该很容易就变成了int
。那么为什么它会抛出错误?
先施
(count+currentPosition-1)
到 int,打破 int 的 +2.147.483.647 边界,然后尝试取模。
尝试:
int EmployeeToBeEliminated = (int)((count+currentPosition-1)%employeesLeft);
这是 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
count
是一个 long
,其值超出了 int
.
的范围
转换应用于紧靠其右侧的(在本例中为带括号的)操作数。您可以想象演员表被括号括起来,如下所示:
( (int)(count+currentPosition-1) ) %employeesLeft
将 (count+currentPosition-1)
的结果转换为 int
导致溢出。
你想要的是:
(int)( (count+currentPosition-1)%employeesLeft )
对于以下值
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
。那么为什么它会抛出错误?
先施
(count+currentPosition-1)
到 int,打破 int 的 +2.147.483.647 边界,然后尝试取模。
尝试:
int EmployeeToBeEliminated = (int)((count+currentPosition-1)%employeesLeft);
这是 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
count
是一个 long
,其值超出了 int
.
转换应用于紧靠其右侧的(在本例中为带括号的)操作数。您可以想象演员表被括号括起来,如下所示:
( (int)(count+currentPosition-1) ) %employeesLeft
将 (count+currentPosition-1)
的结果转换为 int
导致溢出。
你想要的是:
(int)( (count+currentPosition-1)%employeesLeft )