2012-07-17 83 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更合适,因为它提供了期望的“未签名”行为。

相关问题