[英]When a long integer is cast into a short one, what happened?
我使用java將一個長整數y復制到一個短整數x:
long y = 40002;
short x = (short) y;
System.out.println("x now equals " + x);
結果是:x現在等於-25534。
我試圖弄清楚40002是如何投入-25534的,但我失敗了。 40002對應1001 1100 0100 0010,-25534對應1110 0011 1011 1110.任何朋友都可以告訴我這個過程中發生了什么? 非常感謝!
你通過將一個long
到short
方法所做的是一個縮小的原始轉換 ,這由JLS第5.1.3節涵蓋:
將有符號整數縮小到整數類型T只會丟棄除n個最低位之外的所有位,其中n是用於表示類型T的位數。除了可能丟失有關數值大小的信息之外,這可能導致結果值的符號與輸入值的符號不同。
long
值40002
是以下64位:
00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
轉換僅保留最低16位:
10011100 01000010
前導1
以2的補碼表示法解釋為-2 ^ 15,而不是+ 2 ^ 15。 這就解釋了為什么在long
值和short
值中存在2 ^ 16,65,536的差異。
整數溢出發生了。
short是兩個帶符號的字節,這意味着Short.MAX_VALUE
是2 15 -1,即32,767。 “較大”值在邏輯上“環繞”到負范圍內。
在這種情況下,過量是40,002 - 2 15 = 7234
Short.MIN_VALUE
是-2 15 = -32,768
-32,768 + 7234 = -25,534
這是你想知道的數字。
謝謝你們所有人。 根據你的所有答案,我總結如下:長值40002是以下64位:
00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
轉換僅保留最低16位:
10011100 01000010
當JVM將10011100 01000010視為一個短整數時,它會像這樣計算:
-2^15 + 00011100 01000010 = -32768 + 7234 = -25534
就是這個。
基本上,它會循環顯示值,當你達到最大值並加1它將是最低值,所以32768將是-32768,當你達到65536(32768 * 2)它將是0並且當你達到98303(32768 * 2 + 32767)它將是32767,如果你加一個你將得到98304(32768 * 3)並且它將再次是-32768。
所以40002(高於32768但低於32768 * 2)在轉換為空頭時顯然是負數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.