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
addL
,以让编译器知道您正在传递long
值,但正如Tim B所指出的那样*这是危险的,因为30*24*60*60将以整数形式处理,并且只用于最后一次转换为long的乘法*
这样做吧
long thirtyDayInMillis=30L*24*60*60*1000代码>试试看长30天英寸=30*24*60*60*1000L代码>
默认情况下,它被视为int
addL
,以让编译器知道您正在传递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
,因为最高有效位用于表示