Java int 乘法溢出问题

Java int 乘法溢出问题

java中,高精度变量和低精度变量运算,结果会被提到高精度上;但是如果同样精度的变量运算,只是保存结果的变量精度更高的话,其实并不能避免溢出,因为这样运算的返回类型依然是原精度的类型,只是最后赋值的时候将一个低精度的结果赋值给了一个高精度变量上。其实是这样的运算过程:

  • 在乘方时 Java 发现结果已经超出了 int 基本数据类型的最大范围(2147483647),于是作了默认的类型提升(type promotion),中间结果做为 long 类型存放,返回结果时目标数据类型 int 不能够容纳下结果,于是根据 Java 的基础类型的变窄转换(Narrowing primitive conversion)规则,把结果宽于 int 类型宽度的部分全部丢弃,也就是只取结果的低 32 位
  • 而最后将int类型的结果变量赋值给一个高精度的Long

所以,为了避免数据溢出,我们需要让参与运算的变量类型不能全是int,例如:

double d=1024d * 1024 * 1024 * 1024;,加了d,使得一个变量类型变成了double就够了

posted @ 2020-06-28 00:02  别再闹了  阅读(1458)  评论(0编辑  收藏  举报