23

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

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

4

4 に答える 4

25

回答:型のサイズをバイト単位sizeofで返します。


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


標準によって証明されています:

6.5.3.4、ポイント 2:

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

...

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

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

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

于 2012-08-08T15:43:52.400 に答える
6

sizeofsize は常にバイト数として返されます。しかし、ウィキペディアによると:

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

于 2012-08-08T15:43:40.413 に答える
6

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

于 2012-08-08T15:45:09.993 に答える
2

私自身の経験から、エキゾチックな「C」コンパイラを使用して組み込みマイクロコントローラーに取り組んでいると、次のことがわかりました。

sizeof( uint8 )

リターン 1

sizeof( uint16 )

リターン 1

sizeof( uint32 )

リターン 2

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

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

于 2014-08-28T14:12:28.367 に答える