2017-07-28 82 views
0

我正在學習Java,並且對編程完全陌生。我試圖瞭解這段代碼幕後發生了什麼:java中的縮小類型轉換

short c = 234; 
byte d = (byte) c; 
System.out.println(d); 

輸出結果是-22。有人能解釋我幕後發生了什麼魔術嗎?

+0

首先對所有警告你,你必須要了解整數的二進制表示,那麼,你有兩種基本類型,有不同範圍(和位數),當您將值234截斷爲一個字節時,由於二進制表示形式,234成爲負數。 –

+1

,type'short'是16位,'byte'是8位。 – obgnaw

+0

字節已簽名。 234 = 256-22。丟掉256個,因爲它們都不適合一個字節,而你有-22。 – EJP

回答

0

有人能解釋我背後幕後發生了什麼魔術嗎?

沒有魔法可言......檢查什麼是primitives可以在Java持有

字節的限制:字節的數據類型是一個8位有符號二進制補碼整數。 它的最小值爲-128,最大值爲127(含)。 字節數據類型可以用於節省內存節省實際重要的大型陣列, 。它們也可以用在int的地方,它們的極限有助於澄清你的代碼;變量範圍受限的事實 可以作爲 文檔的一種形式。

所以

short c = 234; 

將不適合一個字節,這就是爲什麼你需要cast,負結果值爲你轉換操作

+1

我明白這一點。但我的問題實際上是關於縮小轉換中的信息損失。在這種情況下鑄造的算法是什麼?爲什麼我們得到-22作爲輸出爲什麼不是-30或另一個值?一開始我以爲我們應該得到127,因爲它是最接近234的字節類型可以容納的值。 – AmacOS

+0

@AmacOS因爲它丟棄了高位,並將剩下的內容解釋爲8位有符號值。 – EJP

1

收縮轉換嘗試,以適應後得到什麼在較窄的表示類型中具有較大表示類型的值。
如果具有較大表示類型的值不會溢出較窄表示類型,沒有問題,則值不會更改。

short c = 127; 
byte d = (byte) c; 
System.out.println(d); 

否則,你有一個溢出:

例如以字節,其中最大值爲127,這個代碼將它留在窄型的邊界數值的字節變量127。這是你的實際情況。

例如嘗試此代碼由1溢出字節類型:

short c = 128; 
byte d = (byte) c; 
System.out.println(d); 

byte變量將與127之後的下一個值來估價。
但它不存在。所以在byte範圍內的JVM循環(-128127)。
它使用的最小值爲byte-128

隨着short c = 129;,它會產生-127,等...

2

二進制數23411101010‬

雖然這個數字適合8位,但是java中的一個字節是有符號的,所以在java中最大可能的字節值是127.當最重要的(最左邊的)位被設置時,這意味着「負數」,所以你得到的數字是負數。

現在,您可能會想知道爲什麼您獲得的號碼是-221101010不是22。通過研究數字的二進制補碼錶示可以找到答案。

這裏是它的維基百科文章:https://en.wikipedia.org/wiki/Two's_complement

0

爲了擴大從@Mike Nakis答案。字節的值是-128 - 127.通過明確地告訴編譯器使用(byte)進行投射,您要求編譯器不關心範圍約束並適合它,不管它是什麼。

如果你沒有使用投編譯器將通過打印

incompatible types: possible lossy conversion from short to byte