日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2025/3/8 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java写一个99到0_Java中一个普通的循环为何从10开始到99连续相乘会得到0? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【套裝4本】java編程思想4第4版+

402.5元

包郵

(需用券)

去購買 >

這是一塊非常簡單的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同樣如此)。這是每一步乘法在計算機內部所做的操作:

標注(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元

包郵

(需用券)

去購買 >

總結

以上是生活随笔為你收集整理的java写一个99到0_Java中一个普通的循环为何从10开始到99连续相乘会得到0?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。