与 long 相乘时,数字的输出如何变化?

Posted

技术标签:

【中文标题】与 long 相乘时,数字的输出如何变化?【英文标题】:How output changes for a number when multiplying with long? 【发布时间】:2019-10-24 07:34:22 【问题描述】:

当我将longs 与L 前缀相乘时,我得到了31536000000 的结果。

当我在不带 L 前缀的情况下乘以 longs 时,我得到的结果是 1471228928

得到的结果如何变化?

我认为数字超过了 `int?范围但不确定。

long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL); 

输出:

31536000000
1471228928

【问题讨论】:

是的,int 溢出:正 int 上升到 2^31 ≈ 2*10^9,所以 9 位数。您的产品 3+3+3+3+3 = 12 位。请注意,更安全的是 1000L,因为 1000*60*60*24 已经达到 9 位数。 int * long = long 在第一种情况下。在第二种情况下,它将一些整数相乘,将其转换为 long,然后将结果分配给 longWithoutL 变量。 【参考方案1】:

Java 标准始终将普通数字视为int。如果您想让编译器知道正在操作的数字不是整数类型,则需要后缀字母,例如L, F(浮点数,类似的想法)。

顺便说一句,作为附加信息,+-*/ 运算符的左侧相对于其左侧具有更高的优先级。因此,例如,10L*2*3*4*5 会产生long 的类型。为确保上述示例,可以检查以下图像。

【讨论】:

【参考方案2】:

由于整数结果溢出,它输出不同的结果。当你写long longWithoutL = 1000*60*60*24*365;。 java将该数字读取为整数。乘法超出了 Integer 的范围,java 试图将其放入 Integer 中。要获得正确的输出,请尝试使用 LDF 之类的后缀。如果你写 4.676 也是一样,java 假设数字是 Double 这个问题已经有一个 answer 这里和 here

【讨论】:

答案以=运营商为准。通常,1000*60*60*24*365 会产生int 的类型。由于long 的容量大于int 的容量,所以可以进行翻译。所以,longWithoutL 变量名可能是错误的,至少对我来说是这样。 @snr 是的,这里也一样。我只是复制了他的代码示例。

以上是关于与 long 相乘时,数字的输出如何变化?的主要内容,如果未能解决你的问题,请参考以下文章

将大于 long double 最大限制的 2 个数字相乘 [关闭]

如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?

(C语言)unsigned long类型变量输出时,格式转换说明符应如何定义?

Java中 两个double型数字相乘的问题,想不明白是怎么回事

快速幂取模(当数很大时,相乘long long也会超出的解决办法)

LeetCode - 字符串数字相乘与相加