java写一个99到0_Java中一个普通的循环为何从10开始到99连续相乘会得到0?

【套装4本】java编程思想4第4版+

402.5元

包邮

(需用券)

去购买 >

f22ce081e36827da908204eacd0e31c8.png

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

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同样如此)。这是每一步乘法在计算机内部所做的操作:

4cd09ffb6ec02e7be69321db0a26c212.png

标注(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,感兴趣的朋友请在自己机器上验证结果。有兴趣的同学可以加入技术讨论群:626267345

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

f0f3f55624fb396b1764d42d6df88864.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neo4j java查找_Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径

一、Cypher数据create (小北:朋友圈{姓名:"小北", 喜欢的书类:"Poetry"}),(小菲:朋友圈{姓名:"小菲", 喜欢的书类:"Science Fiction"}),(小鹏:朋友圈{姓名:"小鹏", 喜欢的书类:"Music"}),(小颖:朋友圈{姓名:"…

java 返回两个集合_使用 java stream 获取两个集合之间的交集.差集

原始对象List hrProbationMainList new ArrayList();List hrProbationMains probationMainDao.findAll();获取交集对象stream 转换成流 (只有变成流才能操作)filter 封装判断条件(如果true 则收集到结果中,false则不收集)collect 收集结果返回到指定类型中//交集对象ListhrPro…

java重写重定向_JavaWeb请求转发与请求重定向理解

请求转发使用方法httpServletRequest.getRequestDispatcher("login.jsp").forward(httpServletRequest, servletresponse);此请求过程 完全是一次request对象 完成的。我们可以用 filter 截取用户的这次请求&#xff0c;然后利用这次请求 访问其它页面&#xff0c;当…

autojs调用java识字_autojs实现抽象类的继承

作者: 牙叔使用情景在java中, 抽象类必须继承才能使用, 那么在autojs中怎样实现继承抽象类呢?java中的实现创建一个抽象类package com.yashu;public abstract class Employee{ private String name; private String address; private int number; public abstract double com…

java wix_使用WIX升级MSI

我正在使用WIX创建一个MSI安装程序 . 一切都很好&#xff0c;我能够创建自己的产品并创造一切 .但是&#xff0c;当我想要创建升级时&#xff0c;它无法正常工作 .我使用了以下代码&#xff0c;其中$(var.ProductUpgradeCode)被定义并用作product元素中的upgrade-code .Minimum…

继承易错总结

1.继承会将所有的成员继承下来&#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承&#xff0c;那么他不论哪里都是不可见的&#xff1b;如果是protected继承在类中是可见的&#xff0c;在类外是不可见的&#xff1b;如果是public继承&#xff0c;在任何…

flat在java中的含义_Java 9中Collectors.flatMapping()方法的重要性?

在Java 9中&#xff0c;向Collectors类添加了一个新方法&#xff1a;flatMapping()。它类似于Collectors.mapping()方法&#xff0c;其中flatMapping()方法允许我们处理嵌套的集合。 Collectors.flatMapping()方法需要的功能将被施加到输入元件和集电极积累通过功能传递的元件。…

hhkb适合写java吗_起底这届HHKB最强新品键盘,究竟好在哪儿?

2019年12月HHKB上市了3大品类的12款新品键盘&#xff0c;今天为大家分享外设天下为HHKB Professional HYBIRD Type-S 双模静音旗舰版静电容键盘做的评测&#xff0c;起底这届HHKB新品的最强新品。近日&#xff0c;HHKB更新了旗下的在售产品系列&#xff0c;为了满足严肃、安静办…

java暂停5s_java如何实现继续/暂停按钮

匿名用户1级2016-11-24 回答很简单&#xff0c;我给你写一个Demo&#xff1a;import java.awt.event.*;import javax.swing.*;public class Demo extends Thread {private JFrame frm new JFrame("Demo");private JButton btnPause new JButton("Pause")…

c mysql数据库_C实现MySQL数据库操作

C实现MySQL数据库操作两个月前&#xff0c;也就是9月份&#xff0c;心血来潮在windows下实现了用C连接数据库&#xff0c;当时很是有把linux下一并给实现了。但是没有想得那么简单。这个任务一直推迟到了现在才完成&#xff0c;究其原因&#xff1a;1.我直接用eclipse开发工具&…

php生成不重复时间戳,PHP获取时间戳和微秒数以及生成唯一ID

microtime函数描述&#xff1a;返回当前Unix时间戳和微秒数语法&#xff1a;mixed microtime( [ bool $get_as_float ] )//直接输出echo microtime();//得到的是 如&#xff1a;0.26672100 1585622985 前面是当前微秒数&#xff0c;后面是正常时间戳&#xff0c;中间以空格分隔…

php异步处理任务工具,PHP实现异步任务分发处理利器-Gearman

通常&#xff0c;多语言多系统之间的集成是个大问题&#xff0c;一般来说&#xff0c;人们多半会采用WebService的方式来处理此类集成问题&#xff0c;但不管采用何 种风格的WebService&#xff0c;如RPC风格&#xff0c;或者REST风格&#xff0c;其本身都有一定的复杂性。相比…

java dos窗口小工具下载,maxdos 9 3-maxdos工具箱 v9.3 官方版

maxdos 9 3maxdos工具箱是一个dos工具箱&#xff0c;maxdos工具箱为安装好的电脑系统加入dos&#xff0c;方便用户维护与备份还原&#xff0c;是完全傻瓜化的工作模式&#xff0c;更是可以直接启动硬盘上的光盘ISO镜像一键启动。maxdos工具箱特色说明&#xff1a;1、支持进入DO…

java 1.7 linux rpm,linux下用rpm 安装jdk 7的jdk-7u79-linux-x64.rpm

linux下用rpm 安装jdk 7的jdk-7u79-linux-x64.rpm步骤一、下载jdk的rpm安装包步骤二、如果linux是centos的话&#xff0c;请先卸载openjdk&#xff0c;参考文档&#xff1a;使用rpm命令卸载CentOS 6.4自带的OpenJDK步骤三、安装jdk-7u79-linux-x64.rpm安装包先执行以下命令给所…

普通用户无法执行java,CentOS tomcat普通用户执行配置安装

CentOS tomcat经过长时间的发展&#xff0c;这里我发表一下个人理解&#xff0c;下面就这就来讲术CentOS tomcat。CentOS tomcat6_jdk1.6_安装配置_开启自动运行,普通用户执行 (转)秀脱linux笔记之CentOS tomcat6实战篇由于前段时间一直在外头出差&#xff0c;没有完成CentOS t…

elementui树形复选框,element-ui checkbox 组件的树形联动

前言示例版本为 Element-ui 2.13.0 Vue 2.6.11最近想弄 Element-ui checkbox 的多级联动&#xff0c;网上相关的例子大多数为二级联动&#xff0c;自己研究了一下&#xff0c;弄了一个树形菜单的多级联动&#xff0c;常用于角色管理等业务。(仅供参考&#xff0c;未考虑性能问…

php 魔术方法 sleep,php 魔术方法 sleep() wakeup()

__sleep() 和 __wakeup()public array __sleep ( void )void __wakeup ( void )serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在&#xff0c;该方法会先被调用&#xff0c;然后才执行序列化操作。此功能可以用于清理对象&#xff0c;并返回一个包含对象中…

java 先入先出,java_阻塞队列(FIFO先进先出)

java_阻塞队列(FIFO先进先出)ArrayBlockingQueue&#xff1a;由数组结构组成的有界阻塞队列&#xff1b;LinkedBlockingQueue&#xff1a;由链表结构组成的有界阻塞队列(但大小默认值为&#xff1a;Integer.MAX_VALUE)&#xff1b;PriorityBlockingQueue&#xff1a;支持优先级…

PHP能在Mac上运行吗,PHP Composer无法在Mac上运行

我安装了bitnami mac堆栈主要是因为我的项目需要至少PHP 5.4.7版本.但是,我遇到了作曲家的问题.这是我跑步时遇到的错误&#xff1a;php composer.phar install --dev错误&#xff1a;Richard-Knops-MacBook-Pro:my-project richardknop$php composer.phar install --devdyld: …

主机安装php网站,php支持虚拟主机(php网站空间)

php设置虚拟主机&#xff0c;主要是为了在ie输入地址栏是&#xff0c;可以输入任意的&#xff0c;而不是localhost/&#xff0c;为了方便&#xff0c;但是设置起来很不方便的。。发现不能实现每个站点使用不同的PHP版本&#xff0c;想向大家求教一下&#xff0c;有没有能让。支…