为何从10开始到99连续相乘会得到0?

这是一块非常简单的Java代码片段:

这是一块非常简单的Java代码片段:

//java学习交流:737251827  进入可领取学习资源及对十年开发经验大佬提问,免费解答!public class HelloWorld{public static void main(String []args){     int product = 1;     for (int i = 10; i <= 99; i++) {          product *= i;     }System.out.println(product);   }}

为什么得出的结果是0呢?

问题现象

蛋疼的同学可能会发现这个程序执行的规律:
1 * 10 = 10

10 * 11 = 110

110 * 12 = 1320

1320 * 13 = 17160

17160 * 14 = 240240

240240 * 15 = 3603600

3603600 * 16 = 57657600

57657600 * 17 = 980179200

……

-1342177280 * 40 = -2147483648

-2147483648 * 41 = -2147483648

-2147483648 * 42 = 0

0 * 43 = 0

0 * 44 = 0

……

0 * 97 = 0

0 * 98 = 0
程序从42开始就已经输出0,所以42以后的数字相乘的结果就显而易见了。从结果中发现,乘积的符号已一种难以理解的方式变换着,表明乘积已经溢出了,同时也说明Java并不会理会整数的上下溢出。

问题解答

请记住Java的int类型是32位的有符号二进制补码表示的数字类型(译者注:64为jdk同样如此)。这是每一步乘法在计算机内部所做的操作:

为何从10开始到99连续相乘会得到0?

标注(1)是实际十进制结果。

标注(2)十六进制以及十进制的内部表示结果,int类型只会存储低32位的数据。

标注(3)是标注(2)的补码形式。

如果你好奇0从哪里来,请仔细看上方2进制表示的结果。细心的同学会注意到:

任何一个数与偶数相乘得偶数。

偶数与偶数相乘,会将2进制位整体左移,0从右边填补空位。

偶数与奇数相乘,不会改变最右方0的数量。

当乘法执行的足够多次时,右方的0位会越来越多。最终,连续乘到42时,乘积的2进制表示的低32位全是0,所以int将会是0。

问题扩展

既然知道了问题的原因,我们换一种变量来做同样的操作,以byte为例。

Java的byte变量是8位的有符号数,同样也是补码表示。从上方结果表格看出,连续从10乘到16时,2进制结果的低8位全都是0,所以此时的byte变量是0。而连续乘到15时,低8位是10010000,还记得怎么由补码求原码吗?很简单, 符号位不变,其余位取反加1,得出11110000,既-112,感兴趣的朋友请在自己机器上验证结果。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/112073.html

(0)

相关推荐

  • 带孩子好难熬,带孩子真不容易

    往往有反映当下的父母:在场的孩子。 带孩子真的很难。今天发烧,明天肚子疼,后天拉肚子,咳嗽[疯狂]。我不知道为什么。 然后先问问自己,你犯了多少错? 第一,吃得太多 第二,通过温暖...

    生活 2021年12月11日
  • 这 6 种食物有毒,你可能还在吃

    食以安为先,食品安全与每个人息息相关,生活中一些常见食物也存在潜在的安全隐患,大家在食用时候应加强警惕,保护我们舌尖上的食品安全。

    生活 2021年9月3日
  • 地瓜和白萝卜一起吃,地瓜与萝卜相克吗

    最近地瓜是可以随处可见,随时可以购买的食物。而白菜萝卜也是时令蔬菜。地瓜和萝卜是天气冷了就想吃的好食品。不仅味道好,而且还有益于我们的身体。那吃了地瓜和萝卜,我们的身体会发生什么变化呢?

    生活 2021年11月19日
  • 2022年最受期待的六款旗舰手机堪称神仙打架。

    伴随着2021年最后一波新机潮的开始,即将为2021年画上句号。我们看到了今年各厂商新产品的发布,同时我们也期待2022年手机厂商给我们带来更加好的产品,随着芯片大厂各处理器的发布,各厂商也纷纷摩拳擦掌,很多旗舰手机也要开始更新换代了,谁也不想落后于人,接下来,大帅就带朋友们提前看看都有哪些值得期待的旗舰新机!

    科技 2021年12月19日
  • 首款新骁龙8摩托罗拉Edge X30在《原神》等游戏中功耗高?

    摩托罗拉Edge X30系列发布了,作为首款搭载骁龙8 Gen1的手机,首发价只有2999元(8+128GB),价格上确实有点疯狂。Edge S30搭载骁龙888Plus,首发价也打压到1799元起步,确实有点狠,下面就看看X30搭载骁龙8 Gen1的游戏表现如何。

    科技 2021年12月11日