gpt4 book ai didi

java - java 表达式中的 2L 与 2

转载 作者:行者123 更新时间:2023-12-02 02:07:31 24 4
gpt4 key购买 nike

sum=(sum+2L*(A.length-count1[i])*count1[i])%1000000007;
sum=(sum+2*(A.length-count1[i])*count1[i])%1000000007;

这两种说法有什么区别?它与溢出有何关系?

count1 => 整数类型数组
sum =>长类型。

第一个语句提交了我的代码,但第二个语句在某些情况下导致溢出。
java不会自动在代码中类型转换2 2L如何使它不同。

最佳答案

Won't java type cast 2 in code automatically?

不,Java 不会自动将代码中的 2 转换为 long 。由于运算符的优先级,Java 将先执行乘法再执行加法。这意味着2 ,一个int ,将乘以 (A.length-count1[i]) ,一个int ,和count1[i] ,一个int ,结果是int 。仅当它添加到sum时,一个long ,该产品是否会升级为 long .

How does 2L make it different?

当您放置2L时在代码中,这是 long字面量,所以乘法促进另一个 int发送至long在乘法之前,通过防止溢出来使计算正确。

这里需要了解的基本规则是:

  • Java 有运算符优先级。在这里,对于数学,这遵循数学规则:*、/、% 在 +、- 之前,并且 () 在其他任何内容之前。
  • Java 将至少提升至 int通过二进制数字提升。如果其中一个数据类型比另一个“更高”,则在运算符计算结果之前另一个值将提升为该类型。
  • 但是 Java 不会根据发生的任何溢出来提升类型。作为开发人员,您必须预见可能的溢出并相应地输入变量和值,例如使用2L在这里。

关于java - java 表达式中的 2L 与 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com