それらはすべて4バイトのスペースを必要とするようですが、
違いは何ですか?
まず、int/long のサイズは未規定です。したがって、コンパイラでは、 anintと alongは同じかもしれませんが、これはコンパイラ間で普遍的ではありません。
unsigned longとの違いについてlong:
4 バイトと仮定すると、alongの範囲は-2,147,483,648~2,147,483,647です。unsigned long の範囲は0~4,294,967,295です。
もう 1 つの違いは、オーバーフローです。符号付きの型の場合、オーバーフローの動作は規定されていません。ただし、符号なしの型の場合、オーバーフローは「ラップアラウンド」することが保証されています。
C言語仕様では、int型とlong型の実装を、いくつかの制約内でプラットフォームごとに変えることができます。この変動性はクロスプラットフォームコードの頭痛の種ですが、情報に通じたプログラマーが、ネイティブプロセッサの速度と両方を提供しないハードウェアアーキテクチャの完全な数値範囲の間で設計目標のバランスを取ることができるため、資産でもあります。
一般に、「int」はターゲットCPUアーキテクチャのマシンのマシンレジスタサイズをマップすることになっているため、intタイプのデータのロード、保存、および操作は、ターゲットプロセッサのネイティブレジスタを使用する操作に直接変換されます。
Intは、メモリスペースを節約するために、マシンレジスタサイズより小さくすることができます(大きなintは小さなintの2倍のRAMを使用します)。古いシステムとの互換性とメモリ効率が最優先される64ビットアーキテクチャでも、intを32ビットエンティティと見なすのが一般的です。
「long」は、ターゲットアーキテクチャのレジスタサイズに応じて、「int」と同じサイズまたは「int」より大きくすることができます。ターゲットアーキテクチャがネイティブマシンレジスタでそれほど大きな値をサポートしていない場合、「long」での操作はソフトウェアで実装できます。
電力効率または組み込みデバイス用に設計されたCPUチップは、最近のintとlongの違いを見つける場所です。デスクトップやラップトップPCのような汎用CPU用のコンパイラは、CPUが32ビットレジスタを効率的に使用するため、一般にintとlongを同じサイズで処理します。携帯電話などの小型デバイスでは、CPUは16ビットデータをより自然に処理するように構築されている場合があり、32ビット以上のデータを処理するために一生懸命働かなければなりません。
レジスタあたりのビット数が少ないということは、チップ上で必要な回路が少なく、データをチップに出し入れするためのデータラインが少なく、消費電力が少なく、チップダイサイズが小さいことを意味します。これらはすべて、デバイスのコスト($およびワット)を低くします。 。
このようなアーキテクチャでは、intのサイズは16ビットで、longのサイズは32ビットである可能性があります。また、longの使用に関連するパフォーマンスの低下が発生する可能性があります。これは、待機状態が16ビットデータバスを介した複数の読み取りで32ビットをロードするため、またはネイティブの場合はソフトウェアで長い操作(加算、減算など)を実装するために発生します。ハードウェアは、ハードウェアでのそのような操作をサポートしていません。
原則として、intとlongについて想定できる唯一のことは、どのアーキテクチャでもintの範囲は常にlong以下である必要があるということです。また、いつかコードが別のアーキテクチャ用に再コンパイルされ、intとlongの間に現在表示されている関係が存在しなくなることを想定する必要があります。
これが、日常のありふれたコーディングでも、intをlongから分離するように注意する必要がある理由です。現在のハードウェアプラットフォームの実装の詳細が一致しているため、今日では完全に割り当て互換である可能性がありますが、その一致はすべてのプラットフォームで保証されているわけではありません。
unsigned longとの違いlongは単純で、上限です。符号付きlongは (平均的な 32 ビット システムで) 約 -21 億 (-2^31) から +21 億 (+2^31 - 1) にunsigned longなり、0 から 42 億 (2^32 - 1) になります。
多くのコンパイラやオペレーティング システム (どうやらあなたのものも含む) では、intも 32 ビット値です。ただし、C++ 標準では、これらの型の最大幅は決定されず、最小幅のみが決定されます。一部のシステムでintは、16 ビットです。一部のシステムでlongは、64 ビットです。その多くは、対象となるプロセッサ アーキテクチャと、そのベース ワード サイズに依存します。
ヘッダーlimits.hは、現在のコンパイル環境でのさまざまな型の最大容量を定義するためにstdint.h存在し、幅が保証された環境に依存しない型 ( int32_t.