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