2009-07-03 7 views
1

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とコンパイラの動作が両方とも算術計算には依存しないと仮定してきましたが、このケースでは私の信念を幾分テストしています。

答えて

5

数値キャストは暗黙的ですから、警告が表示される唯一の理由は、コンパイラがリターン時に常にキャストをintにして明示的キャストを冗長にするということです。

+0

ooh!ありがとう!さらに良い。 –

0

はい、get16Bits0は機能するはずです。機能の前にsuppressWarningメタタグを追加するだけです。

5

まず、算術変換を使用して常に「上」に移動できるため、警告が正しく表示されます。データ(または浮動小数点数の精度)が失われる可能性があるため、他の方法ではキャストが必要です。

intからshortに減らすときは、キャストを使用して意図的であることを示す必要があります。しかし、短い値をintに変換すると危険はなく、自動的に起こります。この技術は、異なるビット数で動作します

(x << 16) >> 16 

だから、あなたが必要とするすべては、あなたがキャストを避けたかったかのように、あなたがそれを行うことができ

return (short) x; 
4

です。符号なしバージョンの>>>する

(< < 17×)>> 17

変更>>:15下部に言います。

関連する問題