2013-08-17 64 views
2

我目前從一個ByteBuffer中讀取一個短值並將其應用於一個int。短整型投射,奇怪的行爲

byte[] data = new byte{0x90, 0xAF}; 
ByteBuffer b = ByteBuffer.wrap(data); 
int value = b.getShort(); 

value現在包含0xFFFF90AF而不是0x90AF。 我的解決方案是通過向0xFFFF的位掩碼值:int value = b.getShort() & 0xFFFF;

我認爲一個向上轉型始終是可能的,因爲shortint小。有人可以解釋爲什麼它的行爲如此嗎?

+1

一個方面的評論:'short'到'int'不是* upcast *,因爲'int'不是'short'的超類型。它被稱爲*擴展轉換*。 –

回答

6

short已簽名,並在投射到int時保留。 0x90AF是負數short,所以結果爲負數int。你掩蓋它的解決方案是正確的。

2

short是一個符號量,但你是幸運的:還有char,這是唯一無符號原始的Java類型,是大小相同的short。嘗試使用

int value = b.getChar(); 

這是一個經常被忽略的事實char是在Java中一個完全成熟的數字類型;它只是它的字符串表示,它背叛了它的特殊地位。