2013-11-28 63 views
1

我正在閱讀Java Puzzlers,在問題6中提到了基本數據類型的轉換。 然後,我想嘗試將(-1)轉換爲char並打印出來。它應該打印-1的ascii代碼,對吧?但是沒有一個字符的ASCII碼是-1,有人告訴我它應該是255。事實上,它輸出'?',有沒有人可以給我一個理由?它如何打印'?'在Java中,當我嘗試打印字符(-1)

謝謝,謝謝大家在感恩節。

+1

Ascii的範圍是0到255,因此它會溢出。所以,如果你把字符0加1,它將會變成255,但是如果你取255並且加1,它會變成0 – Quillion

+1

@Quillion Java不使用ASCII而是使用Unicode表。但是其餘的解釋是正確的。 – Pshemo

+0

請參閱此鏈接,它類似於您的問題:http://www.coderanch.com/t/265284/java-programmer-SCJP/certification/Explanation-required-negative-char-prints – Pankaj

回答

2

將-1放入字符將溢出到0xFFFF(因爲它是unsigned 16 bit value。)​​,因此?

如果溢出產生的字符不是非字符,它會罰款顯示:

char x = (char)-65500; 
System.out.println(x); //Prints $ 

原理相同,只是這一次,我們已經溢出來,實際上有一個定義的字符值(36,美元符號)。注意這裏沒有實際的應用 - 你永遠不想故意通過將字符設置爲負值來溢出字符。

+0

謝謝漿果,我明白了。順便說一句,儘管char(-2)的結果是'?',當我比較char(-1)與char(-2)或'?'時,它返回false,也許它們不同? – Diansonn

+0

@Diansonn結果實際上並不是一個''''本身,ascii代碼是63.它只是用一個問號來代表一個非字符(0xFFFF是)來代替一個真實的字符(因爲它是一個非字符,你還要引用它什麼?它必須打印一些東西。)-2以'0xFFFE'類似的方式包裝,這是一個不同的未定義字符。所有等於做的是比較基礎值,而不是角色是否看起來相似或相同 - 所以它當然會返回錯誤。 – berry120

+0

所以,這只是一個包裝。每個人都有不同的包裝。 – Diansonn

1

當你施放-1char你得到的65535字符作爲char是一個16位無符號整數。無論何時將較大的整數轉換爲16位值,都會保留較低的16位。這是一個無效字符的定義,因此將始終打印爲?<?>

順便說一句(char) 255是一個有效的字符。

+0

彼得,據我所知,當0〜127不能識別一個單詞時(例如中文單詞),它會變成unicode,比如utf-8,對不對?所以ascii包含在unicode中。在utf-8中,如果字需要多於一個字節,則會有1到4個比特的'1'來標記它需要多少字節,例如一個雙字節字,它必須是'110xxxxx 10xxxxxx ',三字節字:'1110xxxx 10xxxxxx 10xxxxxx',四字節字:'11110xxx 10xxxxxx 10xxxxxx 10xxxxxx',對吧?所以我們做了很多工作來識別世界上的字,我的問題是,當我嘗試從128-159打印字符時,爲什麼所有結果都是'?' ? – Diansonn