はじめに
この実験では、Java で整数値が short
データ型の範囲内にあるかどうかをチェックする方法を学びます。まず、short
の定義された範囲(-32768 から 32767)を理解し、その後、これらの制限に対して整数値を検証します。最後に、境界値を効果的に処理する方法を探ります。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Java で整数値が short
データ型の範囲内にあるかどうかをチェックする方法を学びます。まず、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
変数に割り当てようとしたときに何が起こるかを調べてみましょう。
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 プログラムを通じて保持できる最大値と最小値を実証しました。この基礎的なステップは、この範囲内の整数値を扱う際に、潜在的なオーバーフローやアンダーフローエラーを回避するために重要です。