2013-12-21 16 views
15

私のラップトップが64ビットまたは32ビットのマシンであるかどうかは、どうすれば分かりますか? (それは64です)。64ビットマシン上のintおよびsizeof intポインタのサイズ

だから、私は、次の印刷について考えた:

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

をし、その結果は奇妙に思えた4、だった

しかし、私はこれを印刷し(これは、64ビットマシンであるため)

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

結果は8です。これは意味がありました。

問題がある:

Iが64ビットマシンを使用しているので、そのようなintは8バイト

(64ビット)を使用し、そののsizeof int型によって必要としてプリミティブ型があるべきであるべきではありません8?それはなぜそうではないのですか?

なぜint *サイズが8ですか?

ここでは混乱ビット、

ので、事前に感謝します。

+7

'size_t'の出力に'%d 'を使用しないでください。UBを呼び出します。 –

+1

http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models – Mat

+1

64ビットアーキテクチャでは32ビットに比べて整数モデルが変更されません。アドレス/ポインタの長さのみ。 – user2672165

答えて

18

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

一方、4GB以上のメモリ(32ビットシステムで対応可能)に対処するには、8バイト幅のポインタが必要です。 int*は "somewhere in memory"というアドレスを保持しているだけで、わずか32ビットで4GB以上のメモリを扱うことはできません。

+2

注:コード、定数データ、スタック、動的データ、さまざまなデータ型などのメモリは、別々の暗黙の_segments_またはアドレス空間に存在する可能性があります。それぞれのアドレスは32ビットであり、それぞれは4GBである。合計は4GBを超えています。このモデルは、関数アドレスとデータアドレスが同じ「値」を持ち、暗示されたセグメントが異なるために異なる方法で比較されることを意味します。さまざまな組込みプロセッサで広く使われている[Harvard architecture](https://en.wikipedia.org/wiki/Harvard_architecture)を考えてみましょう。 Cは多くのアドレススキームに移植可能です。 – chux

+0

これは 'int i = 1ではなく' int * t = malloc(sizeof(int)) 'を使うほうがメモリ効率が良いということですか? int * t =&i'? – wulfgarpro

15

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

wikiは、その上の良い説明があります:Cのための多くのプログラミング環境と 64ビットマシン上のC由来の言語で

、「INT」の変数は、32ビット幅ではまだですが、長い 整数とポインタは64ビット幅です。これらは、 とLP64データモデルを持つものとして記述されています。もう1つの選択肢は、 のILP64データモデルであり、3つのデータタイプすべてが64ビット幅であり、 の「短い」整数もまた64ビット幅のSILP64さえある。 ほとんどの場合、 は単純であり、多くのよく書かれたプログラムは、単に変更なしで新しい環境のために に再コンパイルすることができます。もう1つの 代替品はLLP64モデルで、 32ビットコードとの互換性を維持します。これは、intとlongの両方を32ビットのままにします。 「LL」とは、 「long long integer」タイプを指し、すべてのプラットフォームで少なくとも64ビット、 、32ビット環境を含みます。

3

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

(多分、ポインタは、少なくともint型のサイズでなければならないが。うーん)

+0

なぜ、sizeof(char *)も "8"を返すのはなぜですか? –

+0

@UdbhavKalra 'char 'へのポインタのサイズが8であるため、'Underh(char *)'のサイズは8である場合があります。より新しいプラットフォームでは、4,2、1,3,3のいずれかになります。あなたの疑問にお答えしますか? – chux

+0

私はsizeof(int *)(char *)をテストしましたが、私のプラットフォームでは8つしか与えませんでした。だから、私はそれが何の理由だろうと思ったのですか? –

2

プログラマは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ビットにできます。そのためsize_t型の

0

あなたは%のZU、%Uまたは%は、LUの代わりに%dでそれを表示する必要があり

typedef unsigned int size_t; 

として定義しました。

printf("%zu\n", sizet); 
printf("%u\n", sizet); 
printf("%lu\n", sizet); 
+1

'size_t'は' unsigned int'として定義されていません。 'size_t'は、_least_ 16ビット幅の符号なし整数型です。 'printf("%zu \ n "、sizet);を使うことは正しいです、他は未定義の動作を呼び出すことができます。 – chux

関連する問題