または で十分なのにint
、なぜ Java API は を使用するのでしょうか?short
byte
例:DAY_OF_WEEK
授業の分野Calendar
を使用しますint
。
違いが小さすぎる場合、それらのデータ型 ( short
、int
) はなぜ存在するのでしょうか?
ベストアンサー1
すでに指摘されている理由のいくつかは、例えば「...(ほぼ) byte、short に対するすべての操作は、これらのプリミティブを int に昇格します」しかし、次の疑問は明らかです。なぜこれらのタイプは に昇格されますかint
?
もう1段階深く考えてみると、答えは単にJava仮想マシン命令セットに関連している可能性があります。Java仮想マシン仕様の表、全て加算、除算などの整数演算は、型int
と型でのみ使用可能でありlong
、ない小さいタイプの場合。
(余談ですが、小さいタイプ(byte
とshort
)は基本的に配列。配列のようなnew byte[1000]
場合は1000バイト、のような配列の場合はnew int[1000]
4000バイトかかります)
もちろん、こう言うこともできるだろう「...次の明白な質問は次のようになります:なぜint
これらの手順は(および)に対してのみ提供されていますかlong
?。
理由の 1 つは、前述の JVM 仕様に記載されています。
各型付き命令がJava仮想マシンのランタイムデータ型をすべてサポートしていた場合、1バイトで表現できるよりも多くの命令が存在することになる。
さらに、Java仮想マシンは実際のプロセッサの抽象化と見なすことができます。専用の算術論理ユニットより小さな型の場合、努力する価値はありません。追加のトランジスタが必要になりますが、それでも 1 クロック サイクルで実行できるのは 1 つの加算だけです。JVM が設計されたときの主流のアーキテクチャは 32 ビットで、32 ビットにちょうど適していましたint
(64 ビット値を含む操作はlong
特別なケースとして実装されています)。
(注: 最後の段落は、ベクトル化の可能性などを考慮して少し単純化されていますが、プロセッサ設計のトピックに深く入り込むことなく基本的な考え方を伝えているはずです)
編集:質問の例に焦点を当てた短い補足ですが、より一般的な意味では、保存することが有益ではないかどうかという質問もあります。田畑Calendar.DAY_OF_WEEK
より小さな型を使用します。たとえば、として保存することでメモリを節約できると考えるかもしれませんbyte
。しかし、ここでJavaクラスファイル形式が役立ちます。クラスファイル内のフィールドは、サイズが 1 (32 ビット) である少なくとも 1 つの「スロット」を占有しますint
。(「ワイド」フィールドdouble
と は、2 つのスロットを占有します)。したがって、フィールドをまたはlong
として明示的に宣言しても、メモリは節約されません。short
byte