java - 获取 Java int 的低 16 位作为带符号的 16 位值

标签 java bit-manipulation math

嗯。考虑这个程序,它的目标是找出将整数的低 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/

相关文章:

java - 尝试将工具栏包含到使用 NavDrawer 模板的应用程序中

c - 解释这个功能

math - 在 MATLAB 中匹配两个不同长度的向量

java - -XX :OnOutOfMemoryError ="kill -9 %p" Problem

java - 从rest api获取列表

java - 这个正则表达式是什么意思?

Java:帮助进行基本输出基本值算术。输出为0,不知道为什么?

c++ - 无符号 8 位整数的左移操作

计算设置了 k 位且大于另一个整数 x 的最小整数?

R - 多列 fiddle 图