Android Studio 警告整数乘法隐式转换为 long。如何解决这个问题?

Posted

技术标签:

【中文标题】Android Studio 警告整数乘法隐式转换为 long。如何解决这个问题?【英文标题】:Android studio warns about integer multiplication implicitly cast to long. How to fix this? 【发布时间】:2021-10-12 20:19:00 【问题描述】:
 private static boolean isOverDate(long targetDate, int threshold) 
    return new Date().getTime() - targetDate >= threshold * 24 * 60 * 60 * 1000;

我正在使用上述功能,android Studio 会警告我:

threshold * 24 * 60 * 60 * 1000: integer multiplication implicitly cast to long 

如何解决这个问题?为什么会发出警告?

【问题讨论】:

您在threshold 中的输入是什么? 因为你的targetDatelong 我在两个地方使用这个函数,并分别将 10 和 1 作为阈值传递给它。 请注意,如果您使用现代的java.time 类,您的代码将更易于管理(并且不需要此方法)。 【参考方案1】:

好的,所以取消选择有点复杂。

>= 表达式的 LHS(左侧),我们有:

new Date().getTime() - targetDate

该表达式的类型是long,因为targetDate 被声明为long

在 RHS 我们有:

threshold * 24 * 60 * 60 * 1000

这是一个int,因为所有的操作数都是ints。

但是,该表达式可能溢出。 24 * 60 * 60 * 1000 的值“相当大”,当您将其乘以 threshold 时,结果值可能太大而无法表示为 int。如果它确实溢出,那么结果将被截断,>= 测试会给出错误的结果。

所以...编译器建议您应该使用long 算术进行 RHS 计算。简单的方法是将threshold 声明为long。但您也可以将其转换为 long,如下所示:

((long) threshold) * 24 * 60 * 60 * 1000

【讨论】:

不错的答案。我也在不同的问题中包含了你的答案。【参考方案2】:

因为max_int2 147 483 648

如果您的threshold 大于 25 (25 * 24 * 60 * 60 * 1000 = 2.160.000.000),它将高于 int 可以容纳的值。所以你需要转换为long,否则结果可能不正确。

参考:https://***.com/a/42671759/4316327

如果整数乘法溢出,则结果为 数学乘积的低位,如某些 足够大的二进制补码格式。结果,如果溢出 发生,则结果的符号可能与 两个操作数值的数学乘积。

解决方案:

long timeToCheck = threshold * 24 * 60 * 60 * 1000L;
return new Date().getTime() - targetDate >= timeToCheck;

或单行(这里不同的是L在最后一个数字之后,它会理解你将类型更改为long

return new Date().getTime() - targetDate >= threshold * 24 * 60 * 60 * 1000L;

或铸造

return new Date().getTime() - targetDate >= (long) threshold * 24 * 60 * 60 * 1000;

【讨论】:

如何解决这个警告?或者只是将其转换为 long 可以解决这个问题? @ChaitanyaKarmarkar 不客气。我刚刚又更新了 1 次答案,让你和以后来的人都能明白这一点。 您应该考虑将第一个操作转换为 long 而不是最后一个。

以上是关于Android Studio 警告整数乘法隐式转换为 long。如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

警告:隐式转换在 xcode 6 中会丢失整数精度

将枚举转换为具有溢出的整数时会出现警告

为啥 GCC 会警告这种隐式转换?

C++:禁用隐式转换警告

我应该注意 Visual Studio 给我的这个警告吗?

警告:从枚举类型“UIInterfaceOrientation”到不同枚举类型“UIDeviceOrientation”的隐式转换?