Microsoftを含む多くのソースでは、int型とlong型の両方が4バイトであり、(符号付き)-2,147,483,648から2,147,483,647の範囲であると参照しています。実際に広い範囲の値を提供しない場合、長いプリミティブ型を持つことのポイントは何ですか?
8 に答える
整数型について保証されていることは次のとおりです。
sizeof(char) == 1
sizeof(char) <= sizeof(short)
sizeof(short) <= sizeof(int)
sizeof(int) <= sizeof(long)
sizeof(long) <= sizeof(long long)
sizeof(char) * CHAR_BIT >= 8
sizeof(short) * CHAR_BIT >= 16
sizeof(int) * CHAR_BIT >= 16
sizeof(long) * CHAR_BIT >= 32
sizeof(long long) * CHAR_BIT >= 64
他のものは実装定義です。(4) のおかげで、long
との両方int
が同じサイズを持つことができますが、少なくとも 32 ビットでなければなりません ((9) のおかげで)。
C++ 標準は、それが少なくとも と同じ大きさであることのみを指定してlong
いるため、まったく同じ大きさint
の場合、シナリオに犯罪はありません。完全に実装定義です。さまざまなプラットフォームでは、サイズが問題になる場合があります。たとえば、Linux マシンで現在サイズ 4 とサイズ 8 を使用しています。int
long
他の人が指摘したように、質問の根底にある仮定は部分的にしか当てはまりません。つまり、一部のプラットフォームには当てはまりません。どのようにして現在の状況に至ったのかを本当に理解したい場合は、J. マシェイによる64 ビットへの長い道のりが、存在するさまざまな力とそれらがどのように相互作用したかについての良い見解を提供します。
簡単にまとめると、C はchar
(8 ビット) とint
(16 ビット) で始まりました。次に、short
(16 ビット) とlong
(32 ビット) が追加されint
ましたが、プラットフォームで何が自然であったか、および下位互換性の圧力に応じて、16 ビットまたは 32 ビットになる可能性があります。64 ビットが登場すると、long long
が 64 ビット タイプとして追加され、64 ビット プラットフォームの小さいタイプでいくつかの調整が行われました。int
物事は 32 ビットで安定しましたがlong
、いくつかの 64 ビット プラットフォームは 64 ビットを持っていましたが、long
他の (おそらく Windows だけ?) はlong
32 ビットのままでした。long
ポインタと同じサイズだったので、Windows の API は当時の面影がより多く残っていました。int
は 16 ビットでlong
あったため、32 ビット タイプのみでした)。BTW typedefs ( intXX_t
, intptr_t
) は、意図をより明確にするために追加されましたが、intXX_t
本当に必要なものがない場合にファミリが一定のサイズを強制するリスクがあります。
いいえ、特定のプラットフォームでは 4 バイトしかありません。C++ 標準では、サイズは実装定義のままです。
他のプラットフォームでは、サイズが異なる場合があります。
必ずしも大きくする必要はありません。long
たとえば、私のマシンでGCC を使用した場合、通常は GCCを 8 バイトとして定義する必要があります。標準の文言では、通常、これらの型は「少なくとも X サイズである必要がある」と述べられています (例として、finally-standardized long long
in C++11を確認してください。
基本的に、要件を満たしている限り、誰でも自由にやりたいことを行うことができます。標準によれば、誰かがlong long
256 ビットを作成でき、それは完全に合法です。
long
C++ 言語仕様では、 aのサイズは少なくとも an のサイズでなければならないと単純に述べていint
ます。
以前はint
= 2 バイトとlong
= 4 バイトが標準でした。何らかの理由int
で成長しlong
、同じままでした (少なくとも Windows コンパイラでは)。後方互換性のためlong
に同じままだったと推測することしかできません...
おそらくAProgrammerを除いて、誰もあなたの実際の質問に答えていません。
C/C++ 標準は、Griwes が説明したように定義されています。これにより、コンパイラ ベンダーがコンピュータ アーキテクチャに最も適したサイズを定義できる場所に、C および C++ 言語を実装できます。しばらくの間 (Windows 3.1 以前、つまり Windows 95 より前の場合)、Windows の C コードは 16 ビットの int を持っていましたが、Solaris、HPUX、AIX などの多くの UNIX プラットフォームは 32 ビットの int を持っていました。
しかし、最新のマイクロコンピュータ (386 以降) は完全な 32 ビット レジスタを備えており、32 ビットにアラインされたメモリのアドレス指定は、16 ビット インクリメントにアクセスするよりもはるかに高速です。したがって、コードは 16 ビット int よりも 32 ビット int の方がはるかに効率的です。特に int 配列の場合はそうです。
32 ビット レジスタで 16 ビット int をシミュレートするには、32 ビット目ではなく 16 ビット目でオーバーフローする必要があります。したがって、32 ビットしか使用できない場合でも、32 ビットの int を使用すると簡単です。
実装依存だと思います。それらは異なる場合がありますが、それらを提供するのはベンダー次第です。ただし、一部のベンダーは、構文的に「サポート」されるように単純に作成しています (つまり、それらをコードに入れることができ、コンパイルされますが、違いはありません)。ときどき、このような言語機能に遭遇します。