2012-07-17 87 views
3

我正在開發一個帶有Java的Android 2.3.3應用程序。0xFFFF需要強制轉換?

我有以下代碼:

short CRCAux = 0xffff;

我得到了日食的警告,我有這個值轉換爲短:

short CRCAux = (short) 0xffff;

我遷移的是iOS應用程序到Android和在iOS中,CRCAuxUInt16

爲什麼編譯器需要將該值簡寫爲?是否縮寫一個有符號的int 16位數據類型?

+1

是的,'short'是一個有符號的16位值。 0xffff值太大,無法放入「short」中。幸運的是* *是一個無符號的16位Java類型:'char'。 (但有些人可能會爭辯說,使用'char'作爲數字值有點濫用類型)。 – 2012-07-17 13:59:05

+0

感謝您的回答,但我有另一個問題:我可以使用短作爲iOS UInt16嗎? – VansFannel 2012-07-17 14:00:21

+0

如果我使用'char',我不需要演員。爲什麼? – VansFannel 2012-07-17 14:01:36

回答

4

類似於0xFFFF的文字被java編譯器假定爲int類型。所以它非常正確,你在這裏得到了警告,因爲int值0x0000FFFF沒有正確適合short(編譯器無法知道你不關心在這個特殊情況下截斷上面的零)。

在這種情況下,如果你寫的16位值作爲符號的值,編譯器會接受它,而不投:

短CRCAux = -1;

短類型可用於存儲uint16的值(16位二進制補碼最終只有16位,它只是解釋這些位的問題)。

也就是說,因爲java將這16位表示爲帶符號的二進制補碼。與許多運算符(移位,乘/除和更大/更小的比較)你會得到非常不同的語義。除非你確切知道你在做什麼,否則這很可能會破壞你正在移植的代碼。在這種情況下,Char更合適,因爲它提供了期望的「未簽名」行爲。

相關問題