#include<stdio.h>
int main()
{
int c;
return 0;
} // on Intel architecture
#include <stdio.h>
int main()
{
int c;
return 0;
}// on AMD architecture
/* ここに 2 つの異なるマシンにコードがあり、「データ型のサイズはマシンに依存するか」を知りたい */
#include<stdio.h>
int main()
{
int c;
return 0;
} // on Intel architecture
#include <stdio.h>
int main()
{
int c;
return 0;
}// on AMD architecture
/* ここに 2 つの異なるマシンにコードがあり、「データ型のサイズはマシンに依存するか」を知りたい */
簡単な回答: はい、ほとんどですが...
C の型のサイズは、標準の要件に従って、コンパイラ作成者の決定に依存します。
コンパイラ作成者の決定は、CPU アーキテクチャの影響を強く受ける傾向があります。たとえば、C 標準では次のように規定されています。
「プレーンな」intオブジェクトは、実行環境のアーキテクチャによって提案される自然なサイズを持ちます。
それは判断の余地がたくさんありますが。
このような決定は、他のアーキテクチャ用の同じベンダーのコンパイラとの互換性や、サポートされているサイズごとに型を持つ利便性など、他の考慮事項によっても影響を受ける可能性があります。たとえば、64 ビット システムでは、 の明らかな「自然なサイズ」int
は 64 ビットですが、多くのコンパイラはまだ 32 ビットint
です。(8 ビットchar
と 64 ビットint
でshort
は、おそらく 16 ビットまたは 32 ビットのいずれかになり、両方のサイズをカバーする基本的な整数型を持つことはできません。)
(C99 は「拡張整数型」を導入し、サポートされているすべてのサイズをカバーするという問題を解決できますが、それらを実装するコンパイラは知りません。)
こちらを参照してください: C および C++ の整数/算術型のサイズ保証
基本的な C 型のサイズは、実装 (コンパイラ) とアーキテクチャに依存しますが、いくつかの保証された境界があります。したがって、型のサイズをハードコーディングしてはならず、代わりに sizeof(TYPENAME) を使用して長さをバイト単位で取得してください。
パフォーマンス上の理由から、通常はそうします。char
C 標準では、short
、int
、long
、long long
および対応する符号なしのすべての型の最小値の範囲が定義されています。
ただし、Intel および AMD の x86 CPU は、ほとんどの x86 コンパイラにとって基本的に同じハードウェアです。少なくとも、それらは同じレジスターと命令をプログラマーに公開し、それらのほとんどは同じように動作します (公式に定義され文書化されているものを考慮すれば)。
いずれにせよ、他のサイズを使用するかどうかはコンパイラまたはその開発者次第であり、そのサイズが C 標準に一致している限り、ターゲット ハードウェアの自然なオペランド サイズと必ずしも一致する必要はありません。
はい。基本的なデータ型のサイズは、基盤となる CPU アーキテクチャによって異なります。ISO C (および C++)は、データ型の最小サイズのみを保証します。
ただし、同じ CPU のコンパイラ ベンダー間で一貫性はありません。Intel x386 CPU 用の 32 ビット long int を持つコンパイラと、64 ビット long を提供する他のコンパイラがあることを考慮してください。
そして、Intel 286 マシンの時代に MS プログラマーが対処しなければならなかった 10 年ほどの苦痛を忘れないでください。16 ビット ポインターと 32 ビット セグメント ポインター。私は、その日々が過ぎ去ったことを嬉しく思います。