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.pswp.cn/news/530870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530870.shtml
英文地址,請注明出處:http://en.pswp.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;有沒有能讓。支…