簡體   English   中英

當一個長整數被轉換成一個短整數時,會發生什么?

[英]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.任何朋友都可以告訴我這個過程中發生了什么? 非常感謝!

你通過將一個longshort方法所做的是一個縮小的原始轉換 ,這由JLS第5.1.3節涵蓋:

將有符號整數縮小到整數類型T只會丟棄除n個最低位之外的所有位,其中n是用於表示類型T的位數。除了可能丟失有關數值大小的信息之外,這可能導致結果值的符號與輸入值的符號不同。

long40002是以下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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM