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