Cの整数変数は2バイトまたは4バイトを占めますか?
これは、使用しているプラットフォーム、およびコンパイラーの構成方法によって異なります。唯一の信頼できる答えは、sizeof
演算子を使用して、特定の状況での整数の大きさを確認することです。
それが依存する要因は何ですか?
サイズではなく、範囲を検討することをおすすめします。どちらも実際には異なりますが、後で説明するように、サイズよりも範囲によって変数の型を選択する方がはるかに簡単です。また、標準ではサイズではなく範囲に基づいて整数型を選択することを推奨していますが、ここでは標準的な方法を無視して、好奇心を探り、バイトと整数表現を調べてみましょう...うさぎの穴と自分で見て...sizeof
CHAR_BIT
sizeof
、バイトおよび CHAR_BIT
(上記にリンクされている)C標準から取られた次のステートメントは、これを改善できないと思う言葉で説明しています。
sizeof
オペレータは、発現またはタイプの括弧名前であってもよい、そのオペランドのサイズ(バイト単位)をもたらします。サイズは、オペランドのタイプから決定されます。
明確な理解があると仮定すると、バイトに関する議論につながります。1 バイトは8ビットであると一般に想定されていますが、実際にCHAR_BIT
は1バイトのビット数がわかります。これは、一般的な2バイト(または4バイト)の整数について話すときに考慮されないニュアンスのもう1つにすぎません。
ここまででまとめましょう。
sizeof
=>バイト単位のサイズ、および
CHAR_BIT
=>バイトのビット数
したがって、システムによっては、16の場合のように、ゼロより大きい任意の値(2または4だけではない)にsizeof (unsigned int)
なる可能性があります。1バイト(16ビット)には、標準(以下に引用)。それは必ずしも有用な情報ではありませんか?もっと深く調べてみましょう...CHAR_BIT
整数表現
C標準では、すべての標準整数型(およびCHAR_BIT
、fwiw)の最小精度/範囲をここで指定しています。これから、値を格納するために必要なビット数の最小値を導き出すことができますが、範囲に基づいて変数を選択することもできます。それでも、この回答に必要な詳細の大部分はここにあります。たとえば、標準で(少なくとも)16ビットのストレージが必要である次の例:unsigned int
UINT_MAX 65535 // 2¹⁶ - 1
したがってunsigned int
、(少なくとも)16ビットが必要で、2バイト(CHAR_BIT
8と仮定)を取得する場所であることがわかります。その後、制限がに増加すると2³² - 1
、代わりに4バイトと表示されていました。これは、あなたが観察した現象を説明しています:
ほとんどの教科書では、整数変数は2バイトを占めると述べています。しかし、整数の配列の連続したアドレスを出力するプログラムを実行すると、4の違いが表示されます。
移植性のないCを教えている古代の教科書とコンパイラーを使用しています。あなたの教科書を書いた著者は、気付かないかもしれませんCHAR_BIT
。あなたはすべきであるあなたの教科書(とコンパイラ)をアップグレードし、ITが進化し続けるフィールドは、あなたが滞在する必要があるということであることを覚えておくために努力先の競合...、しかしそのことについて十分に。それらの基礎となる整数バイトが格納する他の非移植可能な秘密を見てみましょう...
値ビットは、一般的な誤解が数えているように見えるものです。上記の例では、unsigned
通常値ビットのみを含む整数型を使用しているため、詳細で悪魔を見逃しがちです。
符号ビット ...上記の例では、コメントから値を抽出する簡単な例UINT_MAX
であるunsigned int
ため、上限として引用しました16
。符号付きの型の場合、正の値と負の値(つまり、符号)を区別するために、符号ビットも含める必要があります。
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
ビットのパディング ...整数にパディングビットを持つコンピュータに遭遇することは一般的ではありませんが、C標準ではそれが可能です。一部のマシン(つまり、このマシン)は、2つの小さい(符号付き)整数値を組み合わせることにより、より大きい整数型を実装します...符号付き整数を組み合わせると、無駄な符号ビットを取得します。その無駄になったビットはCではパディングと見なされます。パディングビットの他の例には、パリティビットとトラップビットが含まれる場合があります。
あなたが見ることができるよう、標準のような考慮の範囲を奨励するようだINT_MIN
... INT_MAX
と、標準から他の最小/最大値の整数型、および選択する際に阻止する可能性が高いなどの忘れする他の微妙な要因があるようなサイズに依存しCHAR_BIT
ていると、パディングビットをの値に影響を与える可能性がありますsizeof (int)
(つまり、2バイト整数と4バイト整数の一般的な誤解は、これらの詳細を無視します)。