3

我正在用 Java 开发一个 Android 2.3.3 应用程序。

我有以下代码:

short CRCAux = 0xffff;

我在 Eclipse 中收到警告,我必须将此值转换为短:

short CRCAux = (short) 0xffff;

我正在将 iOS 应用程序迁移到 Android,而在 iOS 中,CRCAuxUInt16.

为什么编译器需要将该值转换为short?short 是带符号的 int 16 位数据类型吗?

4

1 回答 1

4

像 0xFFFF 这样的文字被 java 编译器假定为 int 类型。因此,您在此处收到警告是非常正确的,因为 int 值 0x0000FFFF 不适合短(在这种特殊情况下,编译器不知道您不关心上零的截断)。

在这种情况下,如果您将 16 位值写入有符号值,编译器将接受它而不进行强制转换:

短 CRCaux = -1;

short 类型可用于存储 uint16 的值(16 位二进制补码毕竟只是 16 位,这只是对这些位的解释问题)。

也就是说,由于 java 假定这 16 位表示有符号的二进制补码。使用许多运算符(移位、乘法/除法和更大/更小比较),您会得到非常不同的语义。除非您确切地知道自己在做什么,否则这很可能会破坏您正在移植的代码。Char 更适合这种情况,因为它提供了所需的“无符号”行为。

于 2012-07-17T14:18:11.193 回答