java长除法二值意外结果
这个代码块的输出是:5为什么结果是5?每个因子都是一个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
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感谢您的关注:)@yasin24*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感谢您的关注:)@yasin24*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