我正在學習Java,並且對編程完全陌生。我試圖瞭解這段代碼幕後發生了什麼:java中的縮小類型轉換
short c = 234;
byte d = (byte) c;
System.out.println(d);
輸出結果是-22。有人能解釋我幕後發生了什麼魔術嗎?
我正在學習Java,並且對編程完全陌生。我試圖瞭解這段代碼幕後發生了什麼:java中的縮小類型轉換
short c = 234;
byte d = (byte) c;
System.out.println(d);
輸出結果是-22。有人能解釋我幕後發生了什麼魔術嗎?
有人能解釋我背後幕後發生了什麼魔術嗎?
沒有魔法可言......檢查什麼是primitives可以在Java持有
字節的限制:字節的數據類型是一個8位有符號二進制補碼整數。 它的最小值爲-128,最大值爲127(含)。 字節數據類型可以用於節省內存節省實際重要的大型陣列, 。它們也可以用在int的地方,它們的極限有助於澄清你的代碼;變量範圍受限的事實 可以作爲 文檔的一種形式。
所以
short c = 234;
將不適合一個字節,這就是爲什麼你需要cast,負結果值爲你轉換操作
收縮轉換嘗試,以適應後得到什麼在較窄的表示類型中具有較大表示類型的值。
如果具有較大表示類型的值不會溢出較窄表示類型,沒有問題,則值不會更改。
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循環(-128
到127
)。
它使用的最小值爲byte
:-128
。
隨着short c = 129;
,它會產生-127
,等...
二進制數234
是11101010
。
雖然這個數字適合8位,但是java中的一個字節是有符號的,所以在java中最大可能的字節值是127.當最重要的(最左邊的)位被設置時,這意味着「負數」,所以你得到的數字是負數。
現在,您可能會想知道爲什麼您獲得的號碼是-22
而1101010
不是22
。通過研究數字的二進制補碼錶示可以找到答案。
這裏是它的維基百科文章:https://en.wikipedia.org/wiki/Two's_complement
爲了擴大從@Mike Nakis答案。字節的值是-128 - 127.通過明確地告訴編譯器使用(byte)
進行投射,您要求編譯器不關心範圍約束並適合它,不管它是什麼。
如果你沒有使用投編譯器將通過打印
incompatible types: possible lossy conversion from short to byte
首先對所有警告你,你必須要了解整數的二進制表示,那麼,你有兩種基本類型,有不同範圍(和位數),當您將值234截斷爲一個字節時,由於二進制表示形式,234成爲負數。 –
,type'short'是16位,'byte'是8位。 – obgnaw
字節已簽名。 234 = 256-22。丟掉256個,因爲它們都不適合一個字節,而你有-22。 – EJP