java长除法二值意外结果

java长除法二值意外结果,java,output,long-integer,division,primitive-types,Java,Output,Long Integer,Division,Primitive Types,这个代码块的输出是:5为什么结果是5?每个因子都是一个int,乘法溢出。尽管您已将结果声明为long,但中间产品都是ints,因为它们的因子是ints 如果将第一个因子声明为long(通过使用后缀L),它将按预期工作: public class LongDivision { public static void main(String[] args) { final long a = 24 * 60 * 60 * 1000 * 1000; final l

这个代码块的输出是:5为什么结果是5?

每个因子都是一个
int
,乘法溢出。尽管您已将结果声明为
long
,但中间产品都是
int
s,因为它们的因子是
int
s

如果将第一个因子声明为
long
(通过使用后缀
L
),它将按预期工作:

public class LongDivision {

    public static void main(String[] args) {
        final long a = 24 * 60 * 60 * 1000 * 1000;
        final long b = 24 * 60 * 60 * 1000;

        System.out.println(a/b);
    }
}

每个因子都是一个
int
,乘法溢出。尽管您已将结果声明为
long
,但中间产品都是
int
s,因为它们的因子是
int
s

如果将第一个因子声明为
long
(通过使用后缀
L
),它将按预期工作:

public class LongDivision {

    public static void main(String[] args) {
        final long a = 24 * 60 * 60 * 1000 * 1000;
        final long b = 24 * 60 * 60 * 1000;

        System.out.println(a/b);
    }
}

24*60*60*1000*1000
溢出并导致
500654080
而不是预期的
86400000000


24L*60*60*1000*1000
按预期工作。

24*60*60*1000*1000
溢出并导致
500654080
而不是预期的
86400000000


24L*60*60*1000*1000
工作正常。

24*60*60*1000*1000=86400000000
。在二进制中,它是
‭0001 0100 0001 1101 1101 0111 0110 0000
‬. 由于文本值的类型为integer,因此将只采用32 LSB。溢出将被丢弃。因此,该值应为
0001 1101 1101 0111 0110 0000 0000
,十进制为
500654080
。这就是你的a值。您的b值是
86400000
。没有溢出。现在你得到的是
500654080/86400000=5

如果您想要问题的正确解决方案,请将第一个文本声明为
long
so

a=24L*60*60*1000*1000


将为您提供预期的输出。

24*60*60*1000*1000=86400000000
。在二进制中,它是
‭0001 0100 0001 1101 1101 0111 0110 0000
‬. 由于文本值的类型为integer,因此将只采用32 LSB。溢出将被丢弃。因此,该值应为
0001 1101 1101 0111 0110 0000 0000
,十进制为
500654080
。这就是你的a值。您的b值是
86400000
。没有溢出。现在你得到的是
500654080/86400000=5

如果您想要问题的正确解决方案,请将第一个文本声明为
long
so

a=24L*60*60*1000*1000


将为您提供预期的输出。

非浮点文字值的类型为int。因此,乘法溢出。使用
L
将文字值指定为long。好的,我知道必须使用文字。但除此之外,我想知道java如何计算除法结果为5。这个或算法的数学运算背景是什么
24*60*60*1000*1000
等于
864000000
或大约860亿。整数溢出量为2147483647,约为21亿。溢出正好得到一个等于
5*24*60*60*1000
的值。2^31大约是21亿,但5*24*60*60*1000等于4.32亿,结果比int max值太小,所以如果这是溢出问题,为什么不是24*60*60*1000*??[6,7,8感谢您的关注:)@yasin
24*60*60*1000*1000=86400000000
。在二进制中,它是‭<代码>0001 0100 0001 1101 1101 0111 0110 0000‬。由于文本值的类型为integer,因此将只采用32 LSB。溢出将被丢弃。因此,该值应为
0001 1101 1101 0111 0110 0000 0000
,十进制为
500654080
。这就是你的a值。你的b值是86400000。没有溢出。所以现在
500654080/86400000
是5。非浮点文本值是int类型的。因此乘法溢出。使用
L
将文字值指定为long。好的,我知道必须使用文字。但除此之外,我想知道java如何计算除法结果为5。这个或算法的数学运算背景是什么
24*60*60*1000*1000
等于
864000000
或大约860亿。整数溢出量为2147483647,约为21亿。溢出正好得到一个等于
5*24*60*60*1000
的值。2^31大约是21亿,但5*24*60*60*1000等于4.32亿,结果比int max值太小,所以如果这是溢出问题,为什么不是24*60*60*1000*??[6,7,8感谢您的关注:)@yasin
24*60*60*1000*1000=86400000000
。在二进制中,它是‭<代码>0001 0100 0001 1101 1101 0111 0110 0000‬。由于文本值的类型为integer,因此将只采用32 LSB。溢出将被丢弃。因此,该值应为
0001 1101 1101 0111 0110 0000 0000
,十进制为
500654080
。这就是你的a值。你的b值是86400000。没有溢出。所以现在
500654080/86400000
是5。如何计算50065408的值为什么不是60065408或其他值也小于int max size如何计算50065408的值为什么不是60065408或其他值也小于int max size