嗯。考虑这个程序,它的目标是找出将整数的低 16 位作为有符号整数的最佳方法。
public class SignExtend16 {
public static int get16Bits(int x)
{
return (x & 0xffff) - ((x & 0x8000) << 1);
}
public static int get16Bits0(int x)
{
return (int)(short)(x);
}
public static void main(String[] args)
{
for (String s : args)
{
int x = Integer.parseInt(s);
System.out.printf("%08x => %08x, %08x\n",
x, get16Bits0(x), get16Bits(x));
}
}
}
我打算使用 get16Bits0 中的代码,但我在 Eclipse 的编译器中收到警告“从 short 到 int 的不必要的转换”,这让我很怀疑,认为编译器可以优化我的“不必要的转换”。当我使用 Eclipse 的编译器在我的机器上运行它时,我从两个函数中得到了相同的结果,它们的行为符合我的预期(测试参数:1 1111 11111 33333 66666 99999)。这是否意味着我可以使用 get16Bits0? (对 future 的代码维护者发出适当的警告)我一直认为 JRE 和编译器的行为对于算术都是机器无关的,但这个案例在某种程度上考验了我的信念。
最佳答案
由于数字转换是隐式友好的,我认为您收到警告的唯一原因是编译器总是会在返回时转换为 int,从而使您的显式转换变得多余。
关于java - 获取 Java int 的低 16 位作为带符号的 16 位值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1080150/