Java API ではなぜ short や byte ではなく int が使用されるのでしょうか? 質問する

Java API ではなぜ short や byte ではなく int が使用されるのでしょうか? 質問する

または で十分なのにint、なぜ Java API は を使用するのでしょうか?shortbyte

例:DAY_OF_WEEK授業の分野Calendarを使用しますint

違いが小さすぎる場合、それらのデータ型 ( shortint) はなぜ存在するのでしょうか?

ベストアンサー1

すでに指摘されている理由のいくつかは、例えば「...(ほぼ) byte、short に対するすべての操作は、これらのプリミティブを int に昇格します」しかし、次の疑問は明らかです。なぜこれらのタイプは に昇格されますかint?

もう1段階深く考えてみると、答えは単にJava仮想マシン命令セットに関連している可能性があります。Java仮想マシン仕様の表全て加算、除算などの整数演算は、型intと型でのみ使用可能でありlongない小さいタイプの場合。

(余談ですが、小さいタイプ(byteshort)は基本的に配列配列のような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として明示的に宣言しても、メモリは節約されません。shortbyte

おすすめ記事