与 long 相乘时,数字的输出如何变化?
Posted
技术标签:
【中文标题】与 long 相乘时,数字的输出如何变化?【英文标题】:How output changes for a number when multiplying with long? 【发布时间】:2019-10-24 07:34:22 【问题描述】:当我将long
s 与L
前缀相乘时,我得到了31536000000
的结果。
当我在不带 L
前缀的情况下乘以 long
s 时,我得到的结果是 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 中。要获得正确的输出,请尝试使用 L
、D
、F
之类的后缀。如果你写 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型数字相乘的问题,想不明白是怎么回事