はじめに
この実験では、Java で整数値が short データ型の範囲内にあるかどうかをチェックする方法を学びます。まず、short の定義された範囲(-32768 から 32767)を理解し、その後、これらの制限に対して整数値を検証します。最後に、境界値を効果的に処理する方法を探ります。
short 型の範囲を設定する(-32768 から 32767)
このステップでは、Java の short データ型を調べ、その範囲を理解します。プログラミングでは、データ型は変数が保持できるさまざまな種類のデータを分類するために使用されます。short データ型は 16 ビットの符号付き 2 の補数整数です。これは、特定の範囲内の正と負の整数を格納できることを意味します。
Java の short の範囲は -32,768 から 32,767 です。これらの制限を理解することは、データ型の範囲外の値を格納しようとしたときに発生する オーバーフロー や アンダーフロー などのエラーを回避するために重要です。
short データ型の動作を確認し、その制限を観察するために、簡単な Java プログラムを作成しましょう。
WebIDE エディタで
HelloJava.javaファイルが開いていない場合は、開きます。ファイルの内容全体を次のコードに置き換えます。
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 を割り当てます。- 次に、
maxShortとminShortを宣言し、shortが保持できる最大値と最小値を割り当てます。 System.out.println()を使用して、これらの変数の値をコンソールに出力します。
ファイルを保存します(Ctrl+S または Cmd+S)。
次に、プログラムをコンパイルしましょう。WebIDE の下部にあるターミナルを開き、
~/projectディレクトリにいることを確認します。そうでない場合は、cd ~/projectコマンドを使用します。次に、javacコマンドを使用してコードをコンパイルします。javac HelloJava.javaエラーがなければ、コンパイルは成功し、
~/projectディレクトリにHelloJava.classファイルが作成されます。最後に、
javaコマンドを使用してコンパイルされたプログラムを実行します。java HelloJavaターミナルに次の出力が表示されるはずです。
My short variable: 10000 Maximum short value: 32767 Minimum short value: -32768
この出力は、short 変数が定義された範囲内の期待される値を保持していることを確認します。次のステップでは、この範囲外の値を割り当てようとしたときに何が起こるかを調べます。
整数を short 型の制限に対して検証する
前のステップでは、short 変数を有効な範囲内で宣言して使用する方法を見ました。では、short の範囲外の値を short 変数に割り当てようとしたときに何が起こるかを調べてみましょう。
Java には、byte、short、int、long など、それぞれ異なる範囲を持つさまざまな整数データ型があります。int(整数)は 32 ビットの符号付き 2 の補数整数で、-2,147,483,648 から 2,147,483,647 の範囲を持ちます。この範囲は short の範囲よりもはるかに大きいです。
大きなデータ型(int など)の値を小さなデータ型(short など)に割り当てようとすると、Java では情報の損失の可能性を承知していることを明示的に伝える必要があります。これを型キャストと呼びます。キャストを行わない場合、Java は誤ったデータ損失を防ぐためにコンパイルエラーを表示します。
これを実証するために、HelloJava.java プログラムを変更しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。既存のコードを次のコードに置き換えます。
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) を下回っています。
ファイルを保存します(Ctrl+S または Cmd+S)。
次に、ターミナルで変更されたプログラムをコンパイルします。
javac HelloJava.java今回は型キャストを使用しているため、コンパイルは成功するはずです。
コンパイルされたプログラムを実行します。
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 プログラムを最後に一度変更しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。既存のコードを次のコードに置き換えます。
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に格納します。- 次に、
overflowIntをshortにキャストし、overflowShortに格納します。ここでオーバーフローが発生し、値が折り返されます。 - 最小の
short値 (minShort) に対しても同様の操作を行い、1 を引いてアンダーフローを実証します。
- 最大の
ファイルを保存します(Ctrl+S または Cmd+S)。
ターミナルでプログラムをコンパイルします。
javac HelloJava.javaコンパイルされたプログラムを実行します。
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 プログラムを通じて保持できる最大値と最小値を実証しました。この基礎的なステップは、この範囲内の整数値を扱う際に、潜在的なオーバーフローやアンダーフローエラーを回避するために重要です。



