使用不同的变量类型进行计算

时间:2014-08-14 17:45:51

标签: java java-8

我正在阅读 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."

请帮帮我。

2 个答案:

答案 0 :(得分:5)

secondslightspeed都声明为int时,lightspeed * seconds会被计算为int s的乘法,从而导致溢出(自16070400000000以来) > 2147483647)。

如果您将intlightspeed投放到seconds,您仍然可以将其保留为long,这将强制在long s上执行乘法:

distance = (long)lightspeed * seconds; 

distance = lightspeed * (long)seconds; 

答案 1 :(得分:1)

是的,只有距离是相关的,正如伊兰指出的那样。

如果您只想到divison,这种行为很容易记住。

如上所述a / b执行整数除法(截断),因为a和b是整数,而

(double) a / b

会返回一个双倍。

请注意,强制转换总是指之后的内容。因此,在包含两个整数的表达式的情况下,第一个整数被转换为double。

`