web-dev-qa-db-ja.com

すべての整数値にlongを使用しないのはなぜですか

私のJavaクラスでは、次のプリミティブデータ型のそれぞれについて学習しました。

  • byte
  • short
  • int
  • long

longデータ型にはほとんどのビットが含まれているため、制限を回避するためにlongデータ型のみを使用することは意味がありませんか?

質問

  • longデータ型のみを使用することに特別な欠点はありますか?
  • たとえば、intデータ型の代わりにlongデータ型を使用するのは理にかなっていますか?
13
Robert Tossly

たとえば、intデータ型の代わりにlongデータ型を使用するのは理にかなっていますか?

絶対にあります。


メモリ/ディスクの使用法

1つまたは2つの変数を使用するだけではパフォーマンスの違いはわかりませんが、アプリが大きくなるとアプリの速度が向上します。

チェック 詳細についてはこの質問

また、 Oracleプリミティブ型のドキュメント いくつかのアドバイスとメモリ使用量を確認できます。

type    memory usage    recommended for
------- --------------- ---------------------------------------------------
byte    8-bit signed    The byte data type can be useful for saving memory in large arrays, where the memory savings actually matters.
short   16-bit signed   same as byte
int     32-bit signed   
long    64-bit          Use this data type when you need a range of values wider than those provided by int
float                   Use a float (instead of double) if you need to save memory in large arrays of floating point numbers. This data type should never be used for precise values, such as currency.

byte

バイトデータ型は、8ビット符号付き2の補数整数です。最小値は-128、最大値は127(両端を含む)です。 バイトデータ型は、メモリの節約が実際に重要である大きな配列でメモリを節約するのに役立ちます。

short

短いデータ型は16ビット符号付き2の補数整数です。最小値は-32,768、最大値は32,767(両端を含む)です。バイトの場合と同様に、同じガイドラインが適用されます:メモリの節約が実際に重要な状況では、shortを使用して大きな配列のメモリを節約できます。

int

デフォルトでは、intデータ型は32ビット符号付き2の補数整数であり、最小値は-2³¹、最大値は2³¹-です。 1.1。 Java SE 8以降では、intデータ型を使用して符号なし32ビット整数を表すことができます。最小値は0、最大値は2³²-1です。

long

Longデータ型は64ビットの2の補数整数です。符号付きlongの最小値は-2⁶³、最大値は2⁶³-1です。 Java SE 8以降では、longデータ型を使用してunsigned 64ビットlongを表すことができます。最小値は0、最大値は2⁶⁴-1です。intで提供される値よりも広い値の範囲が必要な場合は、このデータ型を使用します。 )。

float

Floatデータ型は、単精度32ビットIEEE 754浮動小数点です。その値の範囲はこの説明の範囲を超えていますが、Java言語仕様の浮動小数点型、形式、および値のセクションで指定されています。バイトおよびショートの推奨事項と同様です。 、浮動小数点数の大きな配列にメモリを保存する必要がある場合は、(doubleではなく)floatを使用します。このデータ型は、通貨などの正確な値には使用しないでください。


コードの可読性

また、それはあなたの心とあなたのコードを明確にします、例えばあなたがオブジェクトのIDを表す変数を持っているとしましょう、このオブジェクトIDは決して小数を使用しません、それであなたがあなたのコードで見るならば:

int id;

これで、このIDがどのように表示されるかを確認できます。

double id;

しません。

また、次の場合:

int quantity;
double price;

quantityは小数(完全なオブジェクトのみ)を許可しませんが、価格は許可します...これにより、仕事(および他のプログラマーがコードを読む)が簡単になります。

7
Jordi Castilla

範囲(特定のデータ型に格納できる最小値と最大値)とは別に、別の側面があります。それは変数のsizeです。

次の点にも注意する必要があります。

byte = 1 byte
short = 2 bytes
int = 4 bytes
long = 8 bytes

したがって、long変数を使用するということは、それに8 bytesのメモリを割り当てることを意味します。

何かのようなもの、

long var = 1000L

メモリの効率的な使用を示していません。最近GBがRAM)になったとしても、それを無駄にする必要があるわけではありません。

私が言いたい簡単なポイントは、メモリのより効率的な使用、より速いアプリになるということです。

1
gprathour

メモリの必要性と速度のパフォーマンスは、longを高価にします。

ただし、intにはもう1つの利点があります。それは、int部分式と簡単に混ざりすぎて、操作を間違って組み合わせると長い情報が失われる可能性があることです。 50のビットシフトは実際には18を実行します。 Lの接尾辞が付いた数字のみを使用することは1つの尺度になります。また、longは、int乗算やその他のそのような操作のオーバーフローキャプチャとして機能する場合があります。この場合、オーバーフローを長時間検出するだけで実行できます。

intの場合、byteとshortの「すべての」操作がintに伝播することに注意してください。

0
Joop Eggen