web-dev-qa-db-ja.com

sizeofは、Cの型のバイト数またはオクテット数を返しますか?

単純にCとバリアントを入れます(その仮想マシンではwuss Javaとは異なります))、異なるターゲットのプリミティブ型のサイズは大きく異なる可能性があり、固定幅型を使用しない限り、実際には保証されませんstdint.hで定義されており、それでも実装はそれらをサポートする必要があります。

とにかく仮説的に(ほとんどの最新のマシンではバイトはオクテットであるため、ネットワーキングの目的で(ASCII)と想定しています)、sizeofはデータ型のサイズをバイトまたはオクテットで返しますか?

18
awiebe

回答:sizeofは、型のサイズをbytesで返します。


例:sizeof(char)1であることが100%保証されていますが、これは1オクテット(8ビット)であることを意味するものではありません。


標準によって証明された:

6.5.3.4では、ポイント2:

sizeof演算子は、オペランドのサイズ(バイト単位)を生成します、これは式または括弧で囲まれた型の名前の場合があります。サイズは、オペランドのタイプから決定されます。結果は整数です。オペランドのタイプが可変長配列タイプの場合、オペランドが評価されます。そうでない場合、オペランドは評価されず、結果は整数定数になります。

...

char、unsigned char、signed char型(またはそれらの修飾バージョン)のオペランドに適用すると、結果は1になります。配列型のオペランドに適用すると、結果は配列内の合計バイト数になります)構造体または共用体型のオペランドに適用すると、結果は、内部および末尾のパディング。

また、セクション3.6のポイント3:

1バイトは連続するビットのシーケンスで構成され、その数は実装定義です

18
Kiril Kirov

sizeofは、サイズをバイト単位で示します。ただし、「バイト」はC標準の技術用語であり、sizeof(char) == 1のように定義されていることに注意してください。

6
Stephen Canon

sizeofは常にサイズをバイト数として返します。しかし wikipedia によると:

プログラミング言語CおよびC++では、単項演算子sizeofを使用して、型を表すために必要なバイト数で測定される任意のデータ型のサイズを計算します。このコンテキストの1バイトは、unsigned charと同じです。 まれですが、8ビットよりも大きい場合があります

5
Justin Ethier

私自身の経験から、エキゾチックな「C」コンパイラーを組み込んだ組み込みマイクロコントローラーに取り組んでいると、

sizeof( uint8 )

戻る1

sizeof( uint16 )

戻る1

sizeof( uint32 )

リターン2

明らかに、私がアドレス可能な最小のエンティティが16ビットであるマシンを扱っていたため、sizeofはC89またはC99に準拠していません。

主流のC89とC99に準拠したシステムでは、受け入れられた答えは正しいと思います。残念ながら、「C」コンパイラは、25年前の規格に準拠していなくても、「C」コンパイラと呼ぶことができます。よりエキゾチックなシステムを考えると、この答えが物事を見通しに役立つことを願っています。

2
Bamaco