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

Mik*_*ike 1 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.");

    }
}
Run Code Online (Sandbox Code Playgroud)

执行控制台为我提供了这样的结果:

"In 1000 days light will travel about 16070400000000 miles."
Run Code Online (Sandbox Code Playgroud)

根据我的逻辑,天和秒的变量也应该是int,而它们的值小于2 147 483 647.

在这个例子中,天= 1000和秒= 86 400 000,因此值不是那么大.

但是当我声明这样的变量时:

int lightspeed, days, seconds;
long distance;
Run Code Online (Sandbox Code Playgroud)

我有奇怪的结果,现在我绝不接受它.

"In 1000 days light will travel about -1367621632 miles."
Run Code Online (Sandbox Code Playgroud)

请帮帮我.

Era*_*ran 5

当两个secondslightspeed被声明为时int,lightspeed * seconds被计算为ints 的乘法,这会导致溢出(自16070400000000> 2147483647).

你仍然可以让他们为int你投lightspeedsecondslong,这将强制执行的乘法longS:

distance = (long)lightspeed * seconds; 
Run Code Online (Sandbox Code Playgroud)

要么

distance = lightspeed * (long)seconds; 
Run Code Online (Sandbox Code Playgroud)

  • @Mike假设`天*24*60*60`永远不能通过2 ^ 31-1然后`days`和`seconds`都可以是'int`.在第二次计算中,至少有一个操作数必须很长(或者转换为长)以避免溢出. (2认同)