我在java線下面遇到了,並且對它的輸出感到困惑。能否請您解釋一下我的邏輯的代碼背後這個java代碼背後的邏輯是什麼
System.out.println((int)(char)(byte) -1);
輸出:
65535
我在java線下面遇到了,並且對它的輸出感到困惑。能否請您解釋一下我的邏輯的代碼背後這個java代碼背後的邏輯是什麼
System.out.println((int)(char)(byte) -1);
輸出:
65535
嗯,這是等同於:
byte b = -1;
char c = (char) b; // c = '\uFFFF' - overflow from -1
int i = c; // i = 65535
真正明確轉化爲int
在原來是隻撥打System.out.println(int)
而不是System.out.println(char)
。
相信byte
到char
轉換實際上通過隱式擴大轉換打算先 - 所以是這樣的真:
byte b = -1;
int tmp = b; // tmp = -1
char c = (char) tmp; // c = '\uFFFF'
是否幫助呢?
謝謝喬恩。我明白。還有一個疑問。如果我把System.out.println((char)(byte)-1);那麼它顯示「?」。任何原因 – JavaGeek
這是否意味着'char'在Java中沒有簽名?這使得它成爲唯一的無符號的primitve。 –
@Sukumar:這是因爲字符'0xFFFF'沒有被控制檯識別。 –
在java中byte
是一個帶符號(二進制補碼)的8位的原始類型。值爲-1的byte
的二進制表示形式爲11111111
。然後將其轉換爲16位基元的字符,其值爲\u0000
和\uFFFF
(0和65535)之間的值 - 看起來該字節的位左移了8,並且具有符號擴展。所以在這點上的二進制表示:
1111111111111111
...或65535。但是,那麼不太如說「哦,是的則變成了int
,所以我們沒有看到簡單字符表示並打印出來「。在Java中,所有數字基元都被簽名!如果我們將char作爲另一個16位基元short
進行投射,程序將輸出-1
。但是,當我們將其轉換爲32位int
時。最終的二進制表示爲:
00000000000000001111111111111111
...這是65535都簽名和未簽名!
邏輯是混淆和混淆。 ;)如果你曾經寫過這樣的代碼,那麼值得評論你爲什麼這麼做。 –