19

Microsoftを含む多くのソースでは、int型とlong型の両方が4バイトであり、(符号付き)-2,147,483,648から2,147,483,647の範囲であると参照しています。実際に広い範囲の値を提供しない場合、長いプリミティブ型を持つことのポイントは何ですか?

4

8 に答える 8

34

整数型について保証されていることは次のとおりです。

  1. sizeof(char) == 1
  2. sizeof(char) <= sizeof(short)
  3. sizeof(short) <= sizeof(int)
  4. sizeof(int) <= sizeof(long)
  5. sizeof(long) <= sizeof(long long)
  6. sizeof(char) * CHAR_BIT >= 8
  7. sizeof(short) * CHAR_BIT >= 16
  8. sizeof(int) * CHAR_BIT >= 16
  9. sizeof(long) * CHAR_BIT >= 32
  10. sizeof(long long) * CHAR_BIT >= 64

他のものは実装定義です。(4) のおかげで、longとの両方intが同じサイズを持つことができますが、少なくとも 32 ビットでなければなりません ((9) のおかげで)。

于 2012-11-15T13:45:30.733 に答える
20

C++ 標準は、それが少なくとも と同じ大きさであることのみを指定してlongいるためまったく同じ大きさintの場合、シナリオに犯罪はありません。完全に実装定義です。さまざまなプラットフォームでは、サイズが問題になる場合があります。たとえば、Linux マシンで現在サイズ 4 とサイズ 8 を使用しています。intlong

于 2012-11-15T13:42:14.723 に答える
10

他の人が指摘したように、質問の根底にある仮定は部分的にしか当てはまりません。つまり、一部のプラットフォームには当てはまりません。どのようにして現在の状況に至ったのかを本当に理解したい場合は、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 だけ?) はlong32 ビットのままでした。longポインタと同じサイズだったので、Windows の API は当時の面影がより多く残っていました。intは 16 ビットでlongあったため、32 ビット タイプのみでした)。BTW typedefs ( intXX_t, intptr_t) は、意図をより明確にするために追加されましたが、intXX_t本当に必要なものがない場合にファミリが一定のサイズを強制するリスクがあります。

于 2012-11-15T14:00:35.597 に答える
3

いいえ、特定のプラットフォームでは 4 バイトしかありません。C++ 標準では、サイズは実装定義のままです。

他のプラットフォームでは、サイズが異なる場合があります。

于 2012-11-15T13:39:42.730 に答える
3

必ずしも大きくする必要はありません。longたとえば、私のマシンでGCC を使用した場合、通常は GCCを 8 バイトとして定義する必要があります。標準の文言では、通常、これらの型は「少なくとも X サイズである必要がある」と述べられています (例として、finally-standardized long longin C++11を確認してください。

基本的に、要件を満たしている限り、誰でも自由にやりたいことを行うことができます。標準によれば、誰かがlong long256 ビットを作成でき、それは完全に合法です。

于 2012-11-15T13:44:52.250 に答える
3

longC++ 言語仕様では、 aのサイズは少なくとも an のサイズでなければならないと単純に述べていintます。

以前はint= 2 バイトとlong= 4 バイトが標準でした。何らかの理由intで成長しlong、同じままでした (少なくとも Windows コンパイラでは)。後方互換性のためlongに同じままだったと推測することしかできません...

于 2012-11-15T13:45:47.120 に答える
1

おそらく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 を使用すると簡単です。

于 2012-11-15T16:08:38.777 に答える
0

実装依存だと思います。それらは異なる場合がありますが、それらを提供するのはベンダー次第です。ただし、一部のベンダーは、構文的に「サポート」されるように単純に作成しています (つまり、それらをコードに入れることができ、コンパイルされますが、違いはありません)。ときどき、このような言語機能に遭遇します。

于 2012-11-15T13:43:09.040 に答える