web-dev-qa-db-ja.com

c / c ++のunsigned long / long / intの違いは何ですか?

それらのすべてが4バイトのスペースを取るようです、

違いは何ですか?

19
user198729

まず、int/longのサイズは指定されていません。したがって、コンパイラでは、intlongは同じになる可能性がありますが、これはコンパイラ全体で共通ではありません。

unsigned longlongの違いは:

4バイトと仮定すると、longの範囲は-2,147,483,648から2,147,483,647までです。 unsigned longの範囲は04,294,967,295です。

もう1つの違いは、オーバーフローです。符号付きの型の場合、オーバーフローの動作は規定されていません。しかし、符号なしの型の場合、オーバーフローは「ラップアラウンド」することが保証されています。

25
rlbond

C言語仕様では、int型とlong型の実装を、いくつかの制約内でプラットフォームごとに変えることができます。この変動性はクロスプラットフォームコードの頭痛の種ですが、知識のあるプログラマがネイティブプロセッサの速度と、両方を提供しないハードウェアアーキテクチャの数値範囲全体との間で設計目標のバランスをとることができるため、資産でもあります。

一般に、「int」はターゲットCPUアーキテクチャのマシンのマシンレジスタサイズをマップするため、intタイプのデータのロード、格納、および操作は、ターゲットプロセッサのネイティブレジスタを使用する操作に直接変換される必要があります。

Intは、メモリスペースを節約するために、マシンレジスタサイズよりも小さくすることができます(大きなintは、2倍の容量を必要としますRAM little intと同じです)。古いシステムとの互換性とメモリ効率が優先事項である64ビットアーキテクチャ。

"long"は、ターゲットアーキテクチャのレジスタサイズに応じて、 "int"と同じサイズかそれよりも大きくなります。ターゲットアーキテクチャがネイティブマシンのレジスターで大きな値をサポートしていない場合、 "long"の操作はソフトウェアで実装できます。

電力効率や組み込みデバイス用に設計されたCPUチップは、最近のintとlongの違いを見つける場所です。デスクトップやラップトップPCのような汎用CPU向けのコンパイラは、CPUが32ビットレジスタを効率的に使用するため、通常、intおよびlongを同じサイズとして扱います。携帯電話などの小さなデバイスでは、CPUは16ビットデータをより自然に処理するように構築されている場合があり、32ビット以上のデータを処理するために一生懸命に作業する必要があります。

レジスタあたりのビット数が少ないほど、チップ上で必要な回路が少なくなり、データをチップ内外に移動するためのデータ線が少なくなり、電力消費量が少なくなり、チップダイサイズが小さくなるため、デバイスのコスト($およびワット)が低くなります。 。

このようなアーキテクチャーでは、intのサイズが16ビットで、longのサイズが32ビットであることがよくあります。 16ビットデータバスを介して複数の読み取りで32ビットをロードするための待機状態、またはネイティブである場合にソフトウェアで長い演算(加算、減算など)を実装することにより、longの使用に関連するパフォーマンスペナルティが発生する場合もあります。ハードウェアは、ハードウェアでのこのような操作をサポートしていません。

一般的な規則として、intとlongについて想定できる唯一のことは、どのアーキテクチャでもintの範囲は常にlong以下であることです。また、いつかコードが別のアーキテクチャ用に再コンパイルされ、現在intとlongの間に存在する関係が存在しなくなったと想定する必要もあります。

これが、日常のありふれたコーディングでも、intをlongから分離するように注意する必要がある理由です。現在のハードウェアプラットフォームの実装の詳細は一致しているため、これらは今日完全に割り当て互換である可能性がありますが、その一致はすべてのプラットフォームにわたって保証されていません。

9
dthorpe

まあ、unsigned longlongの違いは単純です-上限です。署名済み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などの環境に依存しない保証された幅のタイプを提供するために存在します。

3
Dan Story