web-dev-qa-db-ja.com

64ビットマシンのintおよびsizeof intポインターのサイズ

私は自分のラップトップが64ビットマシンか32ビットマシンかをどうやって知ることができるのかと思っていました。 (64です)。

だから、私は次を印刷することを考えました:

int main()
{
 printf("%d",sizeof(int));
}

結果は4でしたが、これは奇妙に思えました(64ビットマシンであるため)

しかし、私がこれを印刷したとき:

int main()
{
 printf("%d",sizeof(int*));
}

結果は8で、より意味がありました。

質問は:

私は64ビットマシンを使用しているので、intなどのプリミティブ型は8バイトを使用しないでください

(64ビット)およびそのsizeof intによって8になりますか?なぜそうではないのですか?

そして、なぜint *サイズは8ですか?

ここで少し混乱していますが、

事前に感謝します。

26
Itzik984

いいえ、sizeof(int)は実装定義であり、通常は4バイトです。

一方、4GBを超えるメモリ(32ビットシステムが実行できるメモリ)をアドレスするには、ポインターを8バイト幅にする必要があります。 int*は「メモリのどこかに」アドレスを保持するだけで、32ビットだけで4GBを超えるメモリをアドレス指定することはできません。

24
ScarletAmaranth

ポインターのサイズは、64ビットC/C++コンパイラーでは8バイトでなければなりませんが、intのサイズについては同じではありません。

wiki にはそれに関する良い説明があります:

64ビットマシン上のCおよびC派生言語の多くのプログラミング環境では、「int」変数は依然として32ビット幅ですが、長整数とポインターは64ビット幅です。これらはLP64データモデルを持つものとして説明されています。もう1つの選択肢は、3つのデータ型すべてが64ビット幅であるILP64データモデル、および「短い」整数も64ビット幅であるSILP64でさえあります。[引用が必要]ただし、ほとんどの場合、必要な変更は比較的小さく簡単です、また、多くの適切に作成されたプログラムは、変更せずに新しい環境用に簡単に再コンパイルできます。もう1つの選択肢はLLP64モデルで、intとlongの両方を32ビットのままにして、32ビットコードとの互換性を維持します。 「LL」は「long long integer」型を指し、32ビット環境を含むすべてのプラットフォームで少なくとも64ビットです。

16
Rahul Tripathi

sizeof(int)sizeof(int*)、および「マシンサイズ」は、多くの場合互いに相関関係がありますが、それぞれ独立して他のサイズより小さく、同じ、または大きくすることができます。唯一のC要件は、少なくとも16ビット(またはそれ以上)であることです。それ以外は、sizeof(int)sizeof(int*)にコンパイラ依存しています。

(ただし、ポインターは少なくともintサイズである必要があります。Hmmm)

3
chux

プログラマは、1、2、4、8バイトまたは8、16、32、64ビットの整数型を使用します。 intよりも小さい整数型は、charとshortの2つだけです。 intが64ビットの場合、8、16、32ビットの3つのサイズすべてを使用することはできません。コンパイラがint = 32ビットを作成する傾向があるため、char = 8ビット、short = 16ビット、int = 32ビット、long long = 64ビット、long = 32ビットまたは64ビットを使用できます。

2
gnasher729

Size_tが次のように定義されていたため

typedef unsigned int size_t;

%dではなく、%zu、%u、または%luで表示する必要があります。

printf("%zu\n", sizet);
printf("%u\n", sizet);
printf("%lu\n", sizet);
0
SuperJOE