Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 乘法输出_Java - Fatal编程技术网

Java 乘法输出

Java 乘法输出,java,Java,它应该返回2592000000,但它返回-1702967296 但是如果我把这句话分成两句话 long thirtyDayInMillis = 30 * 24 * 60 * 60 * 1000; 它返回正确的值 对于30*24*60*60*1000,为什么返回-1702967296?默认情况下,Java中的数字文本是ints。因此,第一次乘法的各个部分是ints,而不是longs,因此它们是溢出的(数字太大,无法存储在int中)。分解时,在溢出之前将值转换为long 您可以通过向文本中添加L使

它应该返回
2592000000
,但它返回
-1702967296

但是如果我把这句话分成两句话

long thirtyDayInMillis = 30 * 24 * 60 * 60 * 1000;
它返回正确的值


对于
30*24*60*60*1000
,为什么返回
-1702967296

默认情况下,Java中的数字文本是
int
s。因此,第一次乘法的各个部分是
int
s,而不是
long
s,因此它们是溢出的(数字太大,无法存储在
int
中)。分解时,在溢出之前将值转换为
long

您可以通过向文本中添加
L
使其变长来解决这个问题;您真正需要的只是第一个,从那时起,
30L*24
的结果将是一个
long
,依此类推:

long dayInMillis = 24 * 60 * 60 * 1000;
long thirtyDayInMillis = 30 * dayInMillis;
注意,我将
L
放在第一个文本上。这是因为乘法是从左到右进行的,所以我们希望从一开始就确保我们使用的是
long
值,而不是
int
值。例如,它是这样处理的:

thirtyDayInMillis = 30L * 24 * 60 * 60 * 1000;
首先执行
30L*24
,然后结果是
*60
,依此类推。因此,如果那些较早的值(没有
L
仍作为
int
值)溢出,则结果将是错误的

您的特定表达式直到最后一次乘法才会溢出,但让我们使用将在前面溢出的值:

thirtyDayInMillis = (((30L * 24) * 60) * 60) * 1000;
这给了我们(不正确的)结果
-864731136
,而不是
30240000000000
。现在让我们把
L
放错地方:

thirtyDayInMillis = 1000 * 24 * 6000 * 7000 * 30;
我们得到了
-39519436800
。把它放在正确的地方:

thirtyDayInMillis = 1000 * 24 * 6000 * 7000 * 30L;
// L in wrong place ----------------------------^

…我们得到
30240000000000

默认情况下,Java中的数字文本是
int
s。因此,第一次乘法的各个部分是
int
s,而不是
long
s,因此它们是溢出的(数字太大,无法存储在
int
中)。分解时,在溢出之前将值转换为
long

您可以通过向文本中添加
L
使其变长来解决这个问题;您真正需要的只是第一个,从那时起,
30L*24
的结果将是一个
long
,依此类推:

long dayInMillis = 24 * 60 * 60 * 1000;
long thirtyDayInMillis = 30 * dayInMillis;
注意,我将
L
放在第一个文本上。这是因为乘法是从左到右进行的,所以我们希望从一开始就确保我们使用的是
long
值,而不是
int
值。例如,它是这样处理的:

thirtyDayInMillis = 30L * 24 * 60 * 60 * 1000;
首先执行
30L*24
,然后结果是
*60
,依此类推。因此,如果那些较早的值(没有
L
仍作为
int
值)溢出,则结果将是错误的

您的特定表达式直到最后一次乘法才会溢出,但让我们使用将在前面溢出的值:

thirtyDayInMillis = (((30L * 24) * 60) * 60) * 1000;
这给了我们(不正确的)结果
-864731136
,而不是
30240000000000
。现在让我们把
L
放错地方:

thirtyDayInMillis = 1000 * 24 * 6000 * 7000 * 30;
我们得到了
-39519436800
。把它放在正确的地方:

thirtyDayInMillis = 1000 * 24 * 6000 * 7000 * 30L;
// L in wrong place ----------------------------^

…我们得到了
30240000000000

尝试
长30天inmillis=30*24*60*60*1000L

默认情况下,它被视为
int
add
L
,以让编译器知道您正在传递
long
值,但正如Tim B所指出的那样*这是危险的,因为30*24*60*60将以整数形式处理,并且只用于最后一次转换为long的乘法*

这样做吧


long thirtyDayInMillis=30L*24*60*60*1000

试试看
长30天英寸=30*24*60*60*1000L

默认情况下,它被视为
int
add
L
,以让编译器知道您正在传递
long
值,但正如Tim B所指出的那样*这是危险的,因为30*24*60*60将以整数形式处理,并且只用于最后一次转换为long的乘法*

这样做吧


long thirtyDayInMillis=30L*24*60*60*1000

您正面临最常见的整数溢出问题,
用这个

据介绍,

文本的类型确定如下:
-以L或L结尾的整数文字(§3.10.1)的类型为长(§4.2.1)。
-任何其他整数文字的类型为int(§4.2.1)

因此,表达式
30*24*60*60*1000
被计算为
int
基本数据类型,因为在任何数值中都没有提到
l
l
。结果是
2592000000


i、 e.在二进制中,它是
1001010011110100000000
int
是32位的,因此如前所述,32位取低,结果是
-1702967296
,因为最高有效位用于表示符号。

您面临的是最常见的整数溢出问题,
用这个

据介绍,

文本的类型确定如下:
-以L或L结尾的整数文字(§3.10.1)的类型为长(§4.2.1)。
-任何其他整数文字的类型为int(§4.2.1)

因此,表达式
30*24*60*60*1000
被计算为
int
基本数据类型,因为在任何数值中都没有提到
l
l
。结果是
2592000000

i、 e.在二进制中,它是
100101001111011100 1000 0000
int
是32位,因此如前所述,32位取低,结果是
-1702967296
,因为最高有效位用于表示