0xFFFF需要转换为短整型吗?

3
我正在使用Java开发一个Android 2.3.3应用程序。
我有以下代码: short CRCAux = 0xffff; 在eclipse中,我得到了一个警告,要求我将这个值转换为short类型: short CRCAux = (short) 0xffff; 我正在将一个iOS应用程序迁移到Android,在iOS中,CRCAux是UInt16类型。
为什么编译器需要将该值转换为short类型?short是带符号的16位整数数据类型吗?

1
是的,short 是一个带符号的 16 位值。0xffff 太大了,无法放入 short 中。幸运的是,在 Java 中有一种无符号的 16 位类型:char。(但有人可能会认为将 char 用于数值类型有点滥用该类型)。 - Joachim Sauer
谢谢您的回答,但我有另一个问题:我能否将short用作iOS的UInt16? - VansFannel
如果我使用 char,我为什么不需要转换? - VansFannel
嗯。只要注意有符号和无符号的操作不同(并且这种情况并不多),并进行相应的转换,您就可以将“short”用作无符号16位整数。 - Louis Wasserman
@LouisWasserman 我不这么认为,因为无符号类型的正数范围比有符号类型大。换言之:假设有一个带两位的有符号数据类型,它将接受(1,-1)值。无符号版本将接受(3,0)值。如果将3分配给有符号版本,我会失去精度,不是吗? - VansFannel
嗯?当然有一对一的映射;将有符号转换为无符号,从大于或等于2^15的值中减去2^16。通过这种嵌入方式,有符号加法等同于无符号加法;有符号乘法等同于无符号乘法;唯一有差异的操作是除法、模运算、><以及字符串之间的转换。 - Louis Wasserman
1个回答

4
Java 编译器默认将 0xFFFF 这样的字面量视为 int 类型。因此,在这里收到警告是非常正确的,因为 int 值 0x0000FFFF 不能正确地适应 short(编译器无法知道在这种特殊情况下您不关心上部零的截断)。
在这种情况下,如果您将 16 位值写为带符号值,则编译器将接受它而无需强制转换:
short CRCAux = -1;
short 类型可用于存储 uint16 的值(16 位二进制补码只是 16 位,这只是对这些位的解释问题)。
也就是说,由于 Java 假定这 16 位表示带符号的二进制补码数。使用许多运算符(移位、乘除和大/小比较)会得到非常不同的语义。除非您确切地知道自己在做什么,否则这很可能会破坏您正在移植的代码。在这种情况下,Char 更适合,因为它提供所需的“无符号”行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接