Hmmm。このプログラムは、整数の下位16ビットを符号付き整数として取得する最適な方法を理解することを目的としています。Java intの下位16ビットを符号付き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のコンパイラで警告「intに短いから不要なキャスト」を持って、それは私が不審になり、コンパイラを考えます。 Eclipseのコンパイラを使用してマシン上で実行すると、意図したとおりに動作する両方の関数(テスト引数:1 1111 11111 33333 66666 99999)から同じ結果が得られます。これは私がget16Bits0を使用できることを意味しますか? (将来のコード保守担当者には適切な警告が付いています)私はいつもJREとコンパイラの動作が両方とも算術計算には依存しないと仮定してきましたが、このケースでは私の信念を幾分テストしています。
ooh!ありがとう!さらに良い。 –