Java で整数が short 型の範囲内にあるかどうかを確認する方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java で整数値が short データ型の範囲内にあるかどうかをチェックする方法を学びます。まず、short の定義された範囲(-32768 から 32767)を理解し、その後、これらの制限に対して整数値を検証します。最後に、境界値を効果的に処理する方法を探ります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/type_casting("Type Casting") subgraph Lab Skills java/data_types -.-> lab-560007{{"Java で整数が short 型の範囲内にあるかどうかを確認する方法"}} java/type_casting -.-> lab-560007{{"Java で整数が short 型の範囲内にあるかどうかを確認する方法"}} end

short の範囲を設定する (-32768 から 32767)

このステップでは、Java の short データ型を調べ、その範囲を理解します。プログラミングでは、データ型は変数が保持できるさまざまな種類のデータを分類するために使用されます。short データ型は 16 ビットの符号付き 2 の補数整数です。これは、特定の範囲内の正と負の整数を格納できることを意味します。

Java の short の範囲は -32,768 から 32,767 です。これらの制限を理解することは、データ型の範囲外の値を格納しようとしたときに発生する オーバーフローアンダーフロー などのエラーを回避するために重要です。

short データ型の動作を確認し、その制限を観察するために、簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタで HelloJava.java ファイルが開いていない場合は、開きます。

  2. ファイルの内容全体を次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            // Declare and initialize a short variable
            short myShort = 10000;
            System.out.println("My short variable: " + myShort);
    
            // Demonstrate the maximum value of short
            short maxShort = 32767;
            System.out.println("Maximum short value: " + maxShort);
    
            // Demonstrate the minimum value of short
            short minShort = -32768;
            System.out.println("Minimum short value: " + minShort);
        }
    }

    このコードでは、以下のことを行っています。

    • short 型の変数 myShort を宣言し、値 10000 を割り当てます。
    • 次に、maxShortminShort を宣言し、short が保持できる最大値と最小値を割り当てます。
    • System.out.println() を使用して、これらの変数の値をコンソールに出力します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、プログラムをコンパイルしましょう。WebIDE の下部にあるターミナルを開き、~/project ディレクトリにいることを確認します。そうでない場合は、cd ~/project コマンドを使用します。次に、javac コマンドを使用してコードをコンパイルします。

    javac HelloJava.java

    エラーがなければ、コンパイルは成功し、~/project ディレクトリに HelloJava.class ファイルが作成されます。

  5. 最後に、java コマンドを使用してコンパイルされたプログラムを実行します。

    java HelloJava

    ターミナルに次の出力が表示されるはずです。

    My short variable: 10000
    Maximum short value: 32767
    Minimum short value: -32768

この出力は、short 変数が定義された範囲内の期待される値を保持していることを確認します。次のステップでは、この範囲外の値を割り当てようとしたときに何が起こるかを調べます。

整数を short の制限と照合する

前のステップでは、short 変数を有効な範囲内で宣言して使用する方法を見ました。では、short の範囲外の値を short 変数に割り当てようとしたときに何が起こるかを調べてみましょう。

Java には、byteshortintlong など、それぞれ異なる範囲を持つさまざまな整数データ型があります。int(整数)は 32 ビットの符号付き 2 の補数整数で、-2,147,483,648 から 2,147,483,647 の範囲を持ちます。この範囲は short の範囲よりもはるかに大きいです。

大きなデータ型(int など)の値を小さなデータ型(short など)に割り当てようとすると、Java では情報の損失の可能性を承知していることを明示的に伝える必要があります。これを型キャストと呼びます。キャストを行わない場合、Java は誤ったデータ損失を防ぐためにコンパイルエラーを表示します。

これを実証するために、HelloJava.java プログラムを変更しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 既存のコードを次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            int largeInt = 40000; // This value is outside the short range
    
            // Attempt to assign largeInt to a short variable without casting
            // short myShort = largeInt; // This line will cause a compilation error
    
            // To assign a value from a larger type, we need to cast it
            short myShort = (short) largeInt;
            System.out.println("Value of largeInt cast to short: " + myShort);
    
            int anotherLargeInt = -40000; // Another value outside the short range
            short anotherShort = (short) anotherLargeInt;
            System.out.println("Value of anotherLargeInt cast to short: " + anotherShort);
        }
    }

    この更新されたコードでは、以下のことを行っています。

    • int 変数 largeInt を値 40000 で宣言しています。この値は short が保持できる最大値(32767)を超えています。
    • コメントアウトされた行 short myShort = largeInt; は、キャストを行わない場合に起こること(コンパイルエラー)を示しています。
    • short myShort = (short) largeInt; の行は、int 値を short にキャストする方法を示しています。largeInt の前の (short) がキャスト演算子です。
    • 負の値 anotherLargeInt (-40000) についても同じことを行っています。この値は short が保持できる最小値 (-32768) を下回っています。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、ターミナルで変更されたプログラムをコンパイルします。

    javac HelloJava.java

    今回は型キャストを使用しているため、コンパイルは成功するはずです。

  5. コンパイルされたプログラムを実行します。

    java HelloJava

    次のような出力が表示されます。

    Value of largeInt cast to short: -25536
    Value of anotherLargeInt cast to short: 25536

出力値 (-25536 と 25536) が元の値 (40000 と -40000) ではないことに注意してください。これは、ターゲットのデータ型の範囲外の値をキャストすると、値が「折り返される」ためです。これは、正の値が最大値を超える場合の オーバーフロー と、負の値が最小値を下回る場合の アンダーフロー の例です。正確な結果の値は、数値がバイナリでどのように表されるかによって異なります。これは、データ型の範囲を理解し、キャストを慎重に使用することが、予期しない結果を避けるために重要であることを示しています。

境界値の扱い

前のステップでは、short データ型の範囲について学び、この範囲外の大きな整数値をキャストしたときに何が起こるかを見ました。また、Java が short 範囲の境界値(-32768 と 32767)をどのように扱うかを理解することも重要です。

境界値を扱うときは、特に算術演算を行う際に注意が必要です。最大値に 1 を加えたり、最小値から 1 を引いたりすると、オーバーフロー または アンダーフロー が発生し、値が範囲の反対側に折り返されることがあります。

この境界値の動作を実証するために、HelloJava.java プログラムを最後に一度変更しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 既存のコードを次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            short maxShort = 32767;
            System.out.println("Maximum short value: " + maxShort);
    
            // Adding 1 to the maximum short value
            // Note: The result of maxShort + 1 is an int by default
            int overflowInt = maxShort + 1;
            System.out.println("Maximum short + 1 (as int): " + overflowInt);
    
            // Casting the overflowed int back to short
            short overflowShort = (short) overflowInt;
            System.out.println("Maximum short + 1 (cast to short): " + overflowShort);
    
            short minShort = -32768;
            System.out.println("Minimum short value: " + minShort);
    
            // Subtracting 1 from the minimum short value
            // Note: The result of minShort - 1 is an int by default
            int underflowInt = minShort - 1;
            System.out.println("Minimum short - 1 (as int): " + underflowInt);
    
            // Casting the underflowed int back to short
            short underflowShort = (short) underflowInt;
            System.out.println("Minimum short - 1 (cast to short): " + underflowShort);
        }
    }

    このコードでは、以下のことを行っています。

    • 最大の short 値 (maxShort) から始めます。
    • maxShort に 1 を加えます。デフォルトでは、short(および byte)を含む算術演算は int に昇格されます。したがって、maxShort + 1 の結果は int となり、これを overflowInt に格納します。
    • 次に、overflowIntshort にキャストし、overflowShort に格納します。ここでオーバーフローが発生し、値が折り返されます。
    • 最小の short 値 (minShort) に対しても同様の操作を行い、1 を引いてアンダーフローを実証します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java
  5. コンパイルされたプログラムを実行します。

    java HelloJava

    次のような出力が表示されるはずです。

    Maximum short value: 32767
    Maximum short + 1 (as int): 32768
    Maximum short + 1 (cast to short): -32768
    Minimum short value: -32768
    Minimum short - 1 (as int): -32769
    Minimum short - 1 (cast to short): 32767

ご覧のように、最大の short 値 (32767) に 1 を加えて short にキャストすると、最小値 (-32768) に折り返されます。同様に、最小の short 値 (-32768) から 1 を引いて short にキャストすると、最大値 (32767) に折り返されます。

short のような固定サイズの整数型を扱う際には、この動作を覚えておくことが重要です。常にデータ型の範囲に注意し、オーバーフローやアンダーフローによる予期しない結果を防いでください。

まとめ

この実験では、Java の short データ型について学びました。16 ビットの符号付き 2 の補数表現であること、および -32,768 から 32,767 までの特定の範囲を持つことを理解しました。short 変数の宣言と初期化の方法を調べ、簡単な Java プログラムを通じて保持できる最大値と最小値を実証しました。この基礎的なステップは、この範囲内の整数値を扱う際に、潜在的なオーバーフローやアンダーフローエラーを回避するために重要です。