我正在用 Java 开发一个 Android 2.3.3 应用程序。
我有以下代码:
short CRCAux = 0xffff;
我在 Eclipse 中收到警告,我必须将此值转换为短:
short CRCAux = (short) 0xffff;
我正在将 iOS 应用程序迁移到 Android,而在 iOS 中,CRCAux
是UInt16
.
为什么编译器需要将该值转换为short?short 是带符号的 int 16 位数据类型吗?
像 0xFFFF 这样的文字被 java 编译器假定为 int 类型。因此,您在此处收到警告是非常正确的,因为 int 值 0x0000FFFF 不适合短(在这种特殊情况下,编译器不知道您不关心上零的截断)。
在这种情况下,如果您将 16 位值写入有符号值,编译器将接受它而不进行强制转换:
短 CRCaux = -1;
short 类型可用于存储 uint16 的值(16 位二进制补码毕竟只是 16 位,这只是对这些位的解释问题)。
也就是说,由于 java 假定这 16 位表示有符号的二进制补码。使用许多运算符(移位、乘法/除法和更大/更小比较),您会得到非常不同的语义。除非您确切地知道自己在做什么,否则这很可能会破坏您正在移植的代码。Char 更适合这种情况,因为它提供了所需的“无符号”行为。