我正在阅读 Java:Herbert Schildt的完整参考,现在这里有一件事对我来说并不是很清楚。在关于整数的章节中,它表示当需要大的整数时,应该使用 long 类型。书中的代码示例:
// Compute distance light travels using long variables
class Light {
public static void main(String args[]) {
int lightspeed;
long days;
long seconds;
long distance;
// approximate speed of light in miles per second
lightspeed = 18600;
days = 1000; // specify number of days here
seconds = days * 24 * 60 * 60; // convert to seconds
distance = lightspeed * seconds; // compute distance
System.out.print("In " + days + " days light will travel about " + distance + " miles.");
}
}
执行控制台为我提供了这样的结果:
"In 1000 days light will travel about 16070400000000 miles."
根据我的逻辑,天和秒的变量也应该是 int ,而它们的值小于2 147 483 647。
在这个例子中,天= 1000和秒= 86 400 000,因此值不是那么大。
但是当我声明这样的变量时:
int lightspeed, days, seconds;
long distance;
我的结果很奇怪,现在我绝不接受。
"In 1000 days light will travel about -1367621632 miles."
请帮帮我。
答案 0 :(得分:5)
当seconds
和lightspeed
都声明为int
时,lightspeed * seconds
会被计算为int
s的乘法,从而导致溢出(自16070400000000以来) > 2147483647)。
如果您将int
或lightspeed
投放到seconds
,您仍然可以将其保留为long
,这将强制在long
s上执行乘法:
distance = (long)lightspeed * seconds;
或
distance = lightspeed * (long)seconds;
答案 1 :(得分:1)
是的,只有距离是相关的,正如伊兰指出的那样。
如果您只想到divison,这种行为很容易记住。
如上所述a / b
执行整数除法(截断),因为a和b是整数,而
(double) a / b
会返回一个双倍。
请注意,强制转换总是指之后的内容。因此,在包含两个整数仅的表达式的情况下,第一个整数被转换为double。
`