私はこの質問に対するさまざまな答えを見つけました、そして私は1つの決定的な答えがなければならないことを知っています。Cの4つの主要なデータ型の最小割り当てメモリサイズはどれくらいですか?int
、、、、そして私が考えていることですdouble
。またはタイプは何らかの方法でサイズを変更しますか?float
char
signed
unsigned
6 に答える
ANSI Cは、さまざまなプリミティブデータ型に対して次のサイズを定義しています。
- char
- 最小符号付き範囲:-128 .. 127
- 最小符号なし範囲:0 .. 255
- 大きくすることもできますが、サイズに関係なく、sizeof(char)== 1
- sizeof(unsigned char)== 1
- 短い
- 最小符号付き範囲:-32768 .. 32767
- 最小符号なし範囲:0 .. 65535
- 大きくすることができます
- 長さ
- 最小符号付き範囲:-2147483648 .. 2147483647 ..
- 最小符号なし範囲:0 .. 4294967295
- 大きくすることができます
- int
- 少なくとも、ショートと同じ範囲を持っている必要があります
- ロングと同じ範囲を持つことができます
- 長い範囲よりも大きい範囲を持つことはできません
- short <= int、およびint <= long、ただしshort <long
floatとdoubleにはさらに多くのルールがありますが、一般に、floatの範囲は<= doubleの範囲です(最新のマシンの場合--- floatは4バイト、doubleは8です)。
標準ではバイトのみchar
が保証されています。
残りのタイプには、実装で定義されたサイズがあります。1
符号付きまたは符号なしのタイプは、何らかの方法でサイズを変更しますか?
いいえ。保持されるデータの範囲にのみ影響します。短いデータ型(2バイト)については、以下の例を参照してください。
- 署名済み-32,768〜 + 32,767
- 符号なし0〜65,535
これは素晴らしい質問です。C996.2.5を参照してください。そして、ウィキペディアCのデータ型の記事は問題ありません。
- charは、基本実行文字セットのメンバーを格納するのに十分な大きさです。これは(8ビットで定義される)バイトではありません。質問に書き込むように、これは最小アドレス可能/割り当て可能単位(MAU)であると考えるのが良い方法ですが、一部のシステムではバイトではありません。 。
- intsは一種の興味深いものです。少なくとも2^15-1(16ビット)を保持することになっていると思いますが、現時点ではC99では見つかりません。標準の新しいバージョンでは、実際には32ビット以上として定義されていると思います。これは、非常に多くの人が32ビットであると想定しているためです。ただし、一般に、それらはMAU()の観点から定義された実装であると想定する必要があります
sizeof()
。それだけでなく、仕様ではビットのパディング(エラー訂正など)が許可されています。したがって、8ビット文字システムでは、sizeof(int)
が4の場合、仕様ではこれらのビットの一部を「パディング」として使用できるため、最大intは必ずしも2^31-1ではありません。したがって、確実に知る唯一の方法は、を使用することlimits.h
です。 doubleは常にfloatよりも大きいですが、float/doubleも実装定義です。通常、これらは実装によってIEEE-754仕様(それぞれ最低32ビットと64ビットが必要)と互換性があると定義されていますが、C99では必要ありません。ただし、charサイズが32ビットの場合、sizeof(float)は1にすぎない可能性があります。
符号付き/符号なしはサイズを変更しません。
これらの理由<stdint.h>
から、C言語への最も重要な新しい追加の1つです。それ以前は、クロスプラットフォームのコードを書くことは非常に困難でした。
あなたが使用することができますsizeof(variable)
:
私のローカルマシンでこれを実行する例として:
sizeof (char) = 1
sizeof (double) = 8
sizeof (float) = 4
sizeof (int) = 4
sizeof (long) = 4
sizeof (long long) = 8
sizeof (short) = 2
sizeof (void *) = 4
注:取得する値は、OS/コンパイラ/CPUアーキテクチャによって決定される場合があります。
小さなテストプログラムを書いて、自分の目で確かめてください。
int main(int argc, char* argv[])
{
printf("%d\n", sizeof(char) );
printf("%d\n", sizeof(int) );
printf("%d\n", sizeof(unsigned char) );
printf("%d\n", sizeof(unsigned int) );
printf("%d\n", sizeof(double) );
printf("%d\n", sizeof(float) );
return 0;
}
「int、float、double」はプラットフォームに依存します(16、32、64)。記号はサイズに影響せず、解釈のみに影響します。