簡単に言えば、C とバリアント (その仮想マシンでの wuss java とは異なります) では、さまざまなターゲットのプリミティブ型のサイズが大きく異なる可能性があり、で定義されている固定幅の型を使用しない限り、実際には保証はありませんstdint.h
。それらをサポートするために。
とにかく仮説的に(ほとんどの最新のマシンではバイトはオクテットであるため、ネットワーキングの目的で(ASCII)と想定しているため)sizeofはデータ型のサイズをバイト単位またはオクテット単位で返しますか?
回答:型のサイズをバイト単位sizeof
で返します。
例:sizeof(char)
は であることが 100% 保証されていますが1
、これは 1 オクテット (8 ビット) であることを意味するものではありません。
標準によって証明されています:
6.5.3.4、ポイント 2:
sizeof 演算子は、その operand のサイズ (バイト単位) を生成します。これは、式または括弧で囲まれた型の名前の場合があります。サイズは、オペランドの型から決定されます。結果は整数です。オペランドの型が可変長配列型の場合、オペランドが評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数になります。
...
型 char、unsigned char、または signed char (またはその修飾バージョン) を持つオペランドに適用されると、結果は 1 になります。配列型のオペランドに適用すると、結果は配列内の合計バイト数になります) 構造体または共用体型のオペランドに適用すると、結果はそのようなオブジェクトの合計バイト数になります。末尾のパディング。
また、セクション 3.6 のポイント 3:
バイトは連続したビットのシーケンスで構成され、その数は実装定義です
sizeof
size は常にバイト数として返されます。しかし、ウィキペディアによると:
プログラミング言語 C および C++ では、単項演算子 sizeof を使用して、型を表すのに必要なバイト数で測定されたデータ型のサイズを計算します。このコンテキストでのバイトは unsigned char と同じであり、一般的ではありませんが 8 ビットより大きい場合があります。
sizeof
サイズをバイト単位で指定します。ただし、「バイト」は C 標準の専門用語であり、次のように定義されていることに注意してくださいsizeof(char) == 1
。
私自身の経験から、エキゾチックな「C」コンパイラを使用して組み込みマイクロコントローラーに取り組んでいると、次のことがわかりました。
sizeof( uint8 )
リターン 1
sizeof( uint16 )
リターン 1
sizeof( uint32 )
リターン 2
明らかに、アドレス指定可能な最小エンティティが 16 ビットのマシンを扱っていたため、sizeof は C89 または C99 に準拠していません。
主流の C89 および C99 準拠のシステムでは、受け入れられた答えは正しいと言えます。残念ながら、「C」コンパイラは、25 年前の標準に準拠していなくても、「C」コンパイラと呼ぶことができます。よりエキゾチックなシステムを考えると、この回答が物事を大局的に捉えるのに役立つことを願っています。