为何从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)

相关推荐

  • 肝不好,不能吃鱼?医生提醒:有4种鱼尽量不要吃,请你记住

    由此可见,经常适量地吃一些鱼,能够为身体起到不错的补充效果,不过不同的鱼类当中的营养成分以及有害成分都是不同的,比如有一些鱼类当中就含有众多的有毒物质以及其他的成分,不利于人体的吸收,很容易加重身体的负担。

    生活 2021年10月18日
  • 脾胃虚寒,阳虚失血,中阳不足,医圣张仲景:用此四药良方。

    在中医里面,所说的温里剂,其实可就是用温热的中药材组成的,具有温里助阳、散寒通脉的作用,治疗里寒证的方剂。温里剂治疗的原则主要是根据《黄帝内经》的“寒者热之”“治寒以热”衍生出来的。其实在张仲景的《伤寒杂病论》里记载了许多的这类方药,但是这首方剂有点意思,如果作汤剂,却被称作“人参汤”,如果作为丸剂,它就是理中丸。

    生活 2021年11月25日
  • 湖南十大工业小镇,湖南制造业为何如此硬核

    作者 |大米 编辑 |切毛茂 网红湖南的硬汉工业 说到湖南,你想到了什么? 是湖南美食吗,如剁椒鱼头、臭豆腐、小龙虾、文和友、现代中国茶店等。排队等了两个小时,还是张家界、岳阳楼、...

    生活 2021年11月17日
  • IOS 15.1新功能入门:SharePlay回归相机功能增强。

    苹果今天发布了 iOS/iPadOS 15.1 更新,在 SharePlay 功能的回归之外,还对相机进行了增强。在兼容的设备上,用户可以通过“设置”>“通用”>“软件更新”方式获得iOS 15.1 和iPadOS 15.1。

    科技 2021年10月26日
  • 康熙皇帝对补药的独到见解,不一定能保你健康

    康熙皇帝活了六十九岁,在中国历史上,算是位长寿的皇帝了。与历史上那些希望长生不老而进食补药的皇帝不同的是,康熙皇帝从来不迷信什么补药。他不但自己从来不服用补药,而且对那些希望靠吃补...

    生活 2021年9月22日
  • 飞鹤星飞帆、优博瑞慕等8款热门奶粉深度评测,哪个更好?

    粉哥导读:近年来,宝宝腹泻、便秘、腹部受凉等肠道疾病时常发生。《中国婴幼儿肠道健康白皮书》显示,84.2%的妈妈表示自家宝宝遇到过肠道问题,其中近30%的宝宝经常遭受肠道问题困扰。对于这样的宝宝,应该如何选奶粉呢?今天,奶粉智库评测中心将以此为重点,为大家评测8款知名奶粉!

    生活 2021年9月28日