Java で整数がバイト範囲内にあるかどうかを確認する方法

JavaBeginner
オンラインで実践に進む

はじめに

この実験では、Java で整数値が byte データ型の範囲内にあるかどうかをチェックする方法を学びます。まず、byte の定義された範囲(-128 から 127)を理解します。

その後、整数をこれらの byte の限界値と比較して、有効な範囲内にあるかどうかを判断する方法を学びます。最後に、エッジケースでロジックをテストして、その正しさを確認します。

バイト範囲(-128 から 127)を定義する

このステップでは、Java の byte データ型を探索し、その範囲を理解します。byte データ型は Java のプリミティブデータ型の 1 つで、小さな整数値を格納するために使用されます。

byte 変数は -128 から 127 までの整数値を保持することができます(両端を含む)。これは、バイトが 8 ビットのメモリを使用し、8 ビットで 2^8 = 256 の異なる値を表すことができるためです。これらの値は、ゼロを含む負の数と正の数に分割されます。

byte データ型を示すために、簡単な Java プログラムを作成しましょう。

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

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

    public class HelloJava {
        public static void main(String[] args) {
            byte minByteValue = -128;
            byte maxByteValue = 127;
    
            System.out.println("Minimum byte value: " + minByteValue);
            System.out.println("Maximum byte value: " + maxByteValue);
        }
    }
    

    このコードでは:

    • byte 変数 minByteValue を宣言し、バイトの最小値である -128 を割り当てます。
    • 別の byte 変数 maxByteValue を宣言し、バイトの最大値である 127 を割り当てます。
    • そして、System.out.println を使用してこれらの値をコンソールに出力します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、プログラムをコンパイルしましょう。WebIDE の下部にあるターミナルを開き、~/project ディレクトリにいることを確認します。その後、次のコマンドを実行します。

    javac HelloJava.java
    

    コンパイルが成功すると、何も出力されません。

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

    java HelloJava
    

    次の出力が表示され、byte が保持できる最小値と最大値が示されます。

    Minimum byte value: -128
    Maximum byte value: 127
    

このプログラムは、Java の byte データ型の定義された範囲を示しています。オーバーフローなどの潜在的な問題を回避するために、変数に適切なデータ型を選択する際に、これらの制限を理解することは重要です。

整数をバイトの限界値と比較する

前のステップでは、byte データ型の範囲(-128 から 127)について学びました。では、この範囲外の整数値を byte 変数に代入しようとしたときに何が起こるか見てみましょう。

Java には int のような他の整数データ型もあり、これらははるかに大きな値を保持することができます。大きな値を小さなコンテナに入れようとすると(例えば、int 値を byte に入れようとすると)、問題が発生する可能性があります。

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

  2. main メソッドを変更して、バイトの範囲外の整数値を含めます。main メソッド内の既存のコードを次のコードに置き換えます。

    public static void main(String[] args) {
        int largeIntValue = 200; // This value is outside the byte range
    
        // Trying to assign a large int value to a byte variable
        // byte myByte = largeIntValue; // This line will cause a compilation error
    
        System.out.println("Integer value: " + largeIntValue);
    
        // To assign a larger integer to a byte, you need a cast
        byte castedByte = (byte) largeIntValue;
        System.out.println("Casted byte value: " + castedByte);
    }
    

    変更点を見てみましょう。

    • int 変数 largeIntValue を宣言し、byte が保持できる最大値(127)より大きい値である 200 を割り当てます。
    • コメントアウトされた行 byte myByte = largeIntValue; は、largeIntValue を直接 byte に代入しようとした場合に何が起こるかを示しています。これは、Java が明示的に指示しない限りデータの損失を防ぐため、コンパイルエラーになります。
    • byte castedByte = (byte) largeIntValue; の行は、型キャストを使用して代入を強制する方法を示しています。largeIntValue の前の (byte) は、Java に int 値を byte に変換するよう指示します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、ターミナルで変更したプログラムをコンパイルしてみましょう。

    javac HelloJava.java
    

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

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

    java HelloJava
    

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

    Integer value: 200
    Casted byte value: -56
    

castedByte の値が 200 ではなく -56 であることに注意してください。これは、ターゲット型の範囲外の値をキャストすると、値が「折り返される」ためです。これは オーバーフロー(負の数の場合はアンダーフロー)として知られています。値 200 はバイナリで表され、8 ビット(バイト)に収まるように切り捨てられると、値 -56 になります。

このステップは、データ型の範囲を理解し、異なる型間で変換する際に型キャストを慎重に使用することの重要性を強調しています。これにより、オーバーフローやアンダーフローによる予期しない結果を回避することができます。

エッジケースでテストする

前のステップでは、byte データ型の範囲と、キャストを使用してこの範囲外の値を代入しようとしたときに何が起こるかを見ました。では、今度は byte 範囲の最小値と最大値(-128 と 127)およびこの範囲のすぐ外の値といった境界値ケースを具体的にテストしてみましょう。

境界値ケースをテストすることは、期待される値の境界でコードが正しく動作することを確認するための一般的なプログラミング手法です。

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

  2. main メソッドを変更して、バイトの限界値周辺の値をテストします。main メソッド内の既存のコードを次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            // Values within the byte range
            byte valueWithinRange1 = 0;
            byte valueWithinRange2 = 100;
            byte valueWithinRange3 = -50;
    
            System.out.println("Value within range 1: " + valueWithinRange1);
            System.out.println("Value within range 2: " + valueWithinRange2);
            System.out.println("Value within range 3: " + valueWithinRange3);
    
            // Edge cases
            byte minByte = -128;
            byte maxByte = 127;
    
            System.out.println("Minimum byte value: " + minByte);
            System.out.println("Maximum byte value: " + maxByte);
    
            // Values just outside the byte range (require casting)
            int valueJustBelowMin = -129;
            int valueJustAboveMax = 128;
    
            byte castedBelowMin = (byte) valueJustBelowMin;
            byte castedAboveMax = (byte) valueJustAboveMax;
    
            System.out.println("Value just below min (-129) casted to byte: " + castedBelowMin);
            System.out.println("Value just above max (128) casted to byte: " + castedAboveMax);
        }
    }
    

    このコードでは、以下の値をテストしています。

    • バイトの範囲内に十分収まる値。
    • バイトの範囲の正確な最小値と最大値。
    • 最小値と最大値の範囲のすぐ外の値で、オーバーフロー/アンダーフローの影響を見るためにキャストを使用しています。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

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

    javac HelloJava.java
    

    コンパイルは成功するはずです。

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

    java HelloJava
    

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

    Value within range 1: 0
    Value within range 2: 100
    Value within range 3: -50
    Minimum byte value: -128
    Maximum byte value: 127
    Value just below min (-129) casted to byte: 127
    Value just above max (128) casted to byte: -128
    

範囲のすぐ外の値の出力を観察してください。

  • -129 をバイトにキャストすると 127 になります。これは、-129 が最小値(-128)より 1 小さく、折り返し効果により最大値(127)になるためです。
  • 128 をバイトにキャストすると -128 になります。これは、128 が最大値(127)より 1 大きく、折り返して最小値(-128)になるためです。

これは、byte のような固定サイズのデータ型の範囲外の値をキャストする際の整数のオーバーフロー/アンダーフローの循環的な性質を示しています。

まとめ

この実験では、まず Java の byte データ型の基本概念、特に -128 から 127 の定義された範囲を理解しました。この範囲は、バイトを表すために使用される 8 ビットによって決まり、256 の異なる値を表現できることを学びました。実際の Java プログラムを通じて、byte 変数が保持できる最小値と最大値を宣言して出力する方法を示し、定義された範囲を確認しました。この最初のステップは、その後の整数をバイトの限界値と比較するステップや境界値ケースでのテストに堅固な基礎を提供しました。