16

C および C++ の各標準ではsizeof、数値型が 2 のべき乗でないことを許可していますか?

次の制約が知られています。

  • 16 <= CHAR_BIT * sizeof(int) <= CHAR_BIT * sizeof(long)
  • 32 <= CHAR_BIT * sizeof(long) <= CHAR_BIT * sizeof(long long)
  • 典型的な 8 ビット バイト アーキテクチャでの意味2 <= sizeof(int) && 4 <= sizeof(long)

sizeof(int) == 3 && sizeof(long) == 5それは有効な動作であることを意味しますか?

はいの場合 - 同様に動作する既知のコンパイラ/アーキテクチャはありますか?

4

4 に答える 4

13

3.9.1/2 (C++98) はこれをうまくまとめていると思います (すぐに符号なしの型に関する類似の情報が続きます)。

符号付き整数型には、「signed char」、「short int」、「int」、「long int」の 4 つがあります。このリストでは、各タイプは、少なくともリスト内の前のタイプと同じ量のストレージを提供します。プレーン int は、実行環境のアーキテクチャによって提案される自然なサイズを持ちます39)。その他の符号付き整数型は、特別なニーズを満たすために提供されています。

基本的に私たちが知っているのはsizeof(char) == 1、それぞれの「より大きな」型は少なくともそのint大きさであり、アーキテクチャの「自然な」サイズであるということです (私が知る限り、「自然な」はコンパイラライター次第です)。などのようなことは何も知りませんCHAR_BIT * sizeof(int) <= 32。また、8 である必要はないことも覚えておいてCHAR_BITください。

これらのサイズがネイティブに使用されているハードウェアでは、3 バイトintと 5 バイトが許可されると言っても過言ではありません。longただし、そのようなハードウェア/アーキテクチャについては知りません。

編集: @Nigel Harper のコメントで指摘されているように、範囲要件を満たすintには、少なくとも 16 ビットとlong少なくとも 32 ビットでなければならないことがわかっています。それ以外の場合、上記以外に特定のサイズ制限はありません。

于 2013-07-24T13:13:20.250 に答える