2016-04-03 4 views
1

まあ、size_t,uintptr_t,intptr_tおよびptrdiff_tのCプログラミング言語で定義されたタイプは本当に私を困惑させる。セグメンテーションされたアドレッシングモードを使用する16ビットシステムで、 `size_t`、` uintptr_t`、 `intptr_t`、` ptrdiff_t`型の実際のサイズはどれくらいですか?

Iはフラットメモリモードを用い32ビットシステムでは、4種類の上記の実際の大きさであることに気づいた:

sizeof(size_t) = sizeof(uintptr_t) = sizeof(intptr_t) = sizeof(ptrdiff_t) = 4 

そしてフラットメモリモードを使用64ビットシステム上私はまだ好奇心だ、

sizeof(size_t) = sizeof(uintptr_t) = sizeof(intptr_t) = sizeof(ptrdiff_t) = 8 

しかし:、上記4種類の本当の大きさがあります16ビットシステム上のこれらの4つのタイプの実際のサイズを使用してシステム。

Windows 3.1xによれば、Windows 3.1xは一連の16ビットオペレーティングシステムです。しかし、私は実際の答えをテストして検証するのに適したC言語コンパイラを見つけることができません。

+8

あなたは、オペレーティングシステムの博物館でそのジョブをとっているべきではありません。) – BitTickler

+0

」しかし、本当の答えをテストして検証するのに適したC言語コンパイラを見つけることはできません。 - 私は、Windows 3.1がこれらの標準的な擬似型よりも先行していることがわかります。 –

+0

Windows 3.1およびdos 3.x ... 6.x日に、x86..286のメモリモデルが明示的にモデル化されました。コンパイラはそれを認識していました。 Borland C++(2.x ... 3.x)とMSVCの両方に、似たようなメモリモデルクラスがありました。プログラムのコンパイル(大、小、巨大、コンパイル)のために一般的に選択します。あるいは、#pragma orgiesに細かい制御をすることができます。 – BitTickler

答えて

1

real modesize_tおよびptrdiff_tは16ビットタイプである。ポインタのサイズは、ポインタがnear, far, or hugeかどうかによって異なります。ニア・ポインタには16ビット、その他の32ビットがあります。 intptr_tおよびuintptr_tは、C99の後半でのみ定義されていました。

+0

その時、「」はいなかったと思います。 – BitTickler

+0

@BitTickler私たちが十分遠くに戻ると、リアルモードもありませんでした。つまり、リアルモードと呼ばれていませんでした。もちろん、8086プロセッサが何をしていたとしても「本当の」ものでした。それは言及する必要はなかった。 :) – Kaz

+0

@nwellnhof 'size_t'と' ptrdiff_t'はプログラム用に選択された*メモリモデル*に依存していませんか?私はこのものを使用しましたが、私はよく覚えていません。 – Kaz

0

少なくとも、潜在的にどのコンパイラを使用しているかによって異なります。

16ビット時代からデータ点として、ボーランドターボC++ 3.0マニュアルを言うために、これを有する:

のsizeofの結果の整数型がとして定義され、size_tのでは符号なしのintはstddef.hにあります。

(元に重点。)

unsigned intのサイズは、メモリモデルの独立16ビット、でした。

(あなたがについて尋ねた他のタイプのどれもがまだ存在しない、または、彼らがした場合は、この特定のコンパイラでサポートされていませんでした。)

+0

Turbo C++には5種類のメモリモデルがあり、これらのサイズはさまざまです。 –

+0

http://stackoverflow.com/questions/3575592/what-are-near-far-and-huge-pointers < 。そして、私はそうだと思います。遠く、巨大なものは合成値でした。 Farはセグメント:オフセットであり、巨大なものは正規化されています。合計で32Bit。 – BitTickler

+0

@ M.M:ポインタのサイズは、メモリモデルによって異なります。 'size_t'のサイズは、少なくともマニュアルによるものではありませんでした。 –

関連する問題