短い C#で説明されているように(ただし、Java などの他の言語コンパイラについても)
short から int、long、float、double、または decimal への事前定義された暗黙的な変換があります。
ストレージ サイズが大きい非リテラル数値型を暗黙的に short 型に変換することはできません (整数型のストレージ サイズについては、整数型の表を参照してください)。たとえば、次の 2 つの短い変数 x と y について考えてみましょう。
short x = 5, y = 12;
次の代入ステートメントでは、代入演算子の右側の算術式がデフォルトで int に評価されるため、コンパイル エラーが発生します。
short z = x + y; // Error: no conversion from int to short
この問題を解決するには、キャストを使用します。
short z = (short)(x + y); // OK: explicit conversion
ただし、次のステートメントを使用することは可能ですが、宛先変数のストレージ サイズが同じか、それより大きくなっています。
int m = x + y;
long n = x + y;
良いフォローアップの質問は次のとおりです。
「代入演算子の右側の算術式がデフォルトで int に評価されるのはなぜですか」 ?
最初の答えは次の場所にあります。
整数定数の折りたたみの分類と正式な検証
Java 言語仕様では、整数の表現方法と整数算術式の評価方法が厳密に定義されています。このプログラミング言語はインターネット上の分散アプリケーションで使用するように設計されているため、これは Java の重要な特性です。Java プログラムは、それを実行するターゲット マシンに関係なく、同じ結果を生成する必要があります。
対照的に、C (および広く使用されている命令型およびオブジェクト指向プログラミング言語の大部分) は、よりずさんで、多くの重要な特性が未解決のままです。この不正確な言語仕様の背後にある意図は明らかです。同じ C プログラムは、ターゲット プロセッサに組み込まれた算術演算を使用してソース プログラムの整数演算をインスタンス化することにより、16 ビット、32 ビット、さらには 64 ビット アーキテクチャで実行されることになっています。これにより、使用可能なマシン操作を直接使用できるため、コードがはるかに効率的になります。整数計算が「十分に小さい」数値のみを扱う限り、矛盾は発生しません。
この意味で、C 整数演算は、プログラミング言語の仕様によって正確に定義されていないが、ターゲット マシンを決定することによってのみ完全にインスタンス化されるプレースホルダーです。
Java は、整数の表現方法と整数演算の計算方法を正確に定義します。
Java Integers
--------------------------
Signed | Unsigned
--------------------------
long (64-bit) |
int (32-bit) |
short (16-bit) | char (16-bit)
byte (8-bit) |
Char は唯一の符号なし整数型です。\u0000
その値は からまで\uffff
、つまり 0 から 2 16 -1までのUnicode 文字を表します。
整数演算子に long 型のオペランドがある場合、もう一方のオペランドも long 型に変換されます。それ以外の場合、演算は int 型のオペランドに対して実行され、必要に応じて短いオペランドは int に変換されます。変換規則は正確に指定されています。
[Electronic Notes in Theoretical Computer Science 82 No. 2 (2003)
Blesner-Blech-COCV 2003: Sabine GLESNER , Jan Olaf BLECH,
Fakultät für Informatik,
Universität Karlsruhe
Karlsruhe, Germany]