2011-09-21 63 views
1

我在java線下面遇到了,並且對它的輸出感到困惑。能否請您解釋一下我的邏輯的代碼背後這個java代碼背後的邏輯是什麼

System.out.println((int)(char)(byte) -1); 

輸出:

65535 
+0

邏輯是混淆和混淆。 ;)如果你曾經寫過這樣的代碼,那麼值得評論你爲什麼這麼做。 –

回答

12

嗯,這是等同於:

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)

相信bytechar轉換實際上通過隱式擴大轉換打算先 - 所以是這樣的真:

byte b = -1; 
int tmp = b; // tmp = -1 
char c = (char) tmp; // c = '\uFFFF' 

是否幫助呢?

+0

謝謝喬恩。我明白。還有一個疑問。如果我把System.out.println((char)(byte)-1);那麼它顯示「?」。任何原因 – JavaGeek

+0

這是否意味着'char'在Java中沒有簽名?這使得它成爲唯一的無符號的primitve。 –

+2

@Sukumar:這是因爲字符'0xFFFF'沒有被控制檯識別。 –

5

它一樣

System.out.println((int) '?');

  • (byte) -1給出:-1
  • (char) -1得到:?
  • (int) '?'給出65535
+0

謝謝。它幫助我... – JavaGeek

+0

不客氣! – Neifen

1

在java中byte是一個帶符號(二進制補碼)的8位的原始類型。值爲-1的byte的二進制表示形式爲11111111。然後將其轉換爲16位基元的字符,其值爲\u0000\uFFFF(0和65535)之間的值 - 看起來該字節的位左移了8,並且具有符號擴展。所以在這點上的二進制表示:

1111111111111111 

...或65535。但是,那麼不太如說「哦,是的則變成了int,所以我們沒有看到簡單字符表示並打印出來「。在Java中,所有數字基元都被簽名!如果我們將char作爲另一個16位基元short進行投射,程序將輸出-1。但是,當我們將其轉換爲32位int時。最終的二進制表示爲:

00000000000000001111111111111111 

...這是65535都簽名和未簽名!

+0

'在java中,所有數字原語都被簽名了 - 不可以。這個練習的重點在於表明字符在Java中是無符號的。否則,結果將是0xffffffff而不是0xffff。 – Voo

+0

@Voo是的,'在java中,所有數字原語都是有符號的',我的意思是除字符之外的所有原語,它們並不代表數字(可能是壞的詞的選擇..)。我不明白你的repsonse的第二部分,結果不是0xffff? –

+1

好吧,我只是習慣於像其他任何原始字符一樣處理字符而沒有區別(太多C?),但我可以看到它是如何有效的。第二部分只是說,如果字符沒有unsigned,我們會得到0xffffffff而不是0xffff。 – Voo