2

Cデータ型のサイズが異なるマシンで比較されたWebサイトまたは論文を知っている人はいますか? System zなどの「大きな」マシンの値に興味があります。

And:任意のマシンで最大のネイティブ データ型が持つことができるバイト数の上限はありますcomplex long doubleか?

編集:よくわかりませんが、SIMDレジスタデータもCPUのキャッシュを利用していますか? 特別なユニットに格納され、L1/L2/L キャッシュを使用しないデータ型は私の関心外です。タイプ {char、short、int、long、long long、float、double、long double、_Bool、void *} (および _Complex を使用) のみが検査されます。

4

4 に答える 4

6

C データ型のサイズは、マシン プラットフォームに依存しません。コンパイラの実装に依存します。同じハードウェア プラットフォーム上の 2 つの異なるコンパイラは、基本的な型を異なる方法で実装し、結果としてサイズが完全に異なる場合があります。

size_tなどの標準型は、 のようなユーザーがアクセスできる型で表されることが保証されていないという事実も考慮する必要がありますunsigned intsize_tサイズと範囲が不明な実装固有の unsigned 型を介して実装される可能性があり、非常に合法的です。

また、理論的に (そして衒学的に) C 言語には、サイズに関して「最大の」型はありません。C 言語の仕様では、基本型の相対的なサイズはまったく保証されていません。C 言語は、各型の表現可能な値の相対的な範囲についてのみ保証します。たとえば、言語は の範囲がintの範囲より小さくないことを保証しshortます。ただし、[ほぼ] どの型にも任意の量のパディング ビットを含めることができるため、理論的には、 type のオブジェクト サイズは type のオブジェクト サイズshortよりも大きくなる可能性がありますint。もちろん、これは非常にエキゾチックな状況です。

long long intただし、実際には、これが最大の整数型でlong doubleあり、最大の浮動小数点型であると予想できます。必要に応じて、複合型を考慮に入れることもできます。

于 2010-02-23T23:10:07.390 に答える
0

ネイティブ型の難しい点は、一部のアーキテクチャやコンパイラがネイティブ型を拡張する可能性があることです。たとえば、最新の Intel ハードウェアを対象とするほとんどのコンパイラ__m128は、SIMD レジスタの幅であるデータ型を提供します。AVX の SIMD 幅は 256 ビット、Larrabee は 512 ビットで、コンパイラにはそれぞれ対応するネイティブ型があります。

于 2010-02-23T23:05:06.263 に答える
0

x86 マシンのlong double型は 80 ビット (10 バイト)、http://en.wikipedia.org/wiki/Long_doubleですが、これは多かれ少なかれ時代遅れの形式です。x64 はサポートしていません。

于 2010-02-23T23:10:36.357 に答える
0

「ネイティブ」データ型について言及していますがcomplex、C仕様で定義されていないため、ネイティブ型ではないことに注意してください。charCのネイティブ型はint、、、、、およびfloatです。doublevoid

データ型のサイズは、一般に、基盤となるプラットフォームとコンパイラによって決定されます。C 標準では、これらの型の最小範囲が定義され、いくつかの相対的な関係が定義されています (long int少なくとも通常intと同じ長さである必要があるなど)。テストせずに型の絶対サイズを決定する簡単な方法はありません。

新しいプラットフォームで作業していて、特定のデータ型のサイズがわからない場合、sizeofすべての標準 C 型の結果をダンプする短いアプリを作成します。stdint.h特定のサイズであると信頼できるデータ型を提供するようなヘッダーもあります。

データ型のサイズに上限はありません。C 標準ではchar、「実行文字セットの任意のメンバーを格納するのに十分な大きさ」と定義されています。これにより、ネイティブ型のサイズがマシン アーキテクチャに部分的にバインドされるため、最大 1MB のサイズの実行文字を持つ理論上のマシンは 1MB にsizeof(char)等しくなります。実際には、これに該当するマシンはおそらくないでしょう。

于 2010-02-23T23:29:50.837 に答える