1

Turbo C コンパイラでは、sizeof() 演算子を使用すると、int ポインターのサイズが 2 バイトとして表示されます。ここで、int 変数のアドレスを出力すると、8 桁の 16 進数になり、アドレスのサイズは 32 ビット (または 4 バイト) になります。

では、Turbo コンパイラがポインタのサイズを 2 バイトと表示するのはなぜですか?

4

5 に答える 5

6

プログラムはスモール メモリ モデルでコンパイルされます。つまり、データ スペース全体が占めるスペースは 64K 以下です。プログラムが開始されると、DS レジスタはそのデータ空間を指しているため、データ空間内の任意の場所を参照するために必要なポインターは 16 ビットだけです。

中規模および大規模メモリ モデルでは、データ領域が 64K を超える可能性があり、ポインターが 32 ビットであることがわかります。

Alok のコメントを参照してください。代替品についてはgccを参照してください。

于 2013-01-04T15:34:05.250 に答える
3

私は Turbo C を使ったことはありませんが、古い 16 ビット DOS/Windows コンパイラだと思います。16 ビット プログラムには、near ポインターと far ポインターがありました。Near ポインターは 2 バイトで、現在のセグメントのみを指すことができました。far ポインターは、2 バイトのセグメントと 2 バイトのオフセットであり、20 ビットのアドレス指定を行うためにシフトおよび追加されました。

表示されている 8 桁は、現在のセグメントのシフトされた値に追加された 2 バイトのポインターです。x86 メモリ セグメンテーションを参照してください: http://en.wikipedia.org/wiki/X86_memory_segmentation

于 2013-01-04T15:35:49.103 に答える
2

これの本当の答えは、使用している Turbo C の設定によって異なります。ポインターは、"near" ポインターか "far" ポインターかによって、16 ビットまたは 32 ビットにすることができます。far ポインターは、16 ビットのセグメント部分と 16 ビットのオフセット部分を持つことにより、その時代 (約 20 年以上前) の PC が持つ 1MB のメモリ範囲の「すべて」をアドレス指定できます。これらの値は として結合され(segment << 4) + offsetます。

データおよび/またはコードのnearポインタまたはfarポインタを取得するかどうかを決定するコードおよびデータ空間の「モデル」があります。

このページでは、さまざまなモデルについて説明しています : http://www.tti.unipa.it/~ricrizzo/KS/Data/PBurden/chap6.msdos.memory.html、そしてもちろん、最後の 64KB は「BIOS」であり、A0000-EFFFF 間のメモリは「メモリ マップド ハードウェア」であるため、実際には最大 64KB しか使用できません [そして、A20 ゲートを「フリップ」すると、 1MBを超えるRAMがあると仮定して、RAMとして1MBを超える64KB-16バイト])

もちろん、他の人が言ったように、世界のほとんどの国で運転免許を取得できるほど古いコンパイラの使用はやめてください。最近はもっと優れた製品が他にもあります (「より優れた」の定義が何であれ、「フロッピー ディスクで提供される」がより優れていると定義されている場合を除きます)。

于 2013-01-05T00:30:23.497 に答える
2

おそらく、Turbo C の 16 ビット バージョンがあり、それがintそのコンパイラのサイズです: http://www.cs.technion.ac.il/~nikol/material/types_sizes.pdf

実際、Turbo C のすべてのバージョンは明らかに 16 ビットでした。

gcc他の人がすでに示唆しているように、またはのような最新の C コンパイラを入手してくださいclang

于 2013-01-04T15:34:47.607 に答える
0

コンピュータが DOS だけで動いていた時代がありました。当時、オペレーティング システムの起動はリアル モード ブートでした。そのため、リアル モード オペレーティング システムでは、OS は 1MB のアドレス空間しか使用できません。turboc は実際にはリアル モード用に作成されているため、16 ビットと呼ばれます。Turboc は、コンピュータの RAM が何であるか、またはプロセッサが 16 ビットか 32 ビットか 64 ビットかを知りません。したがって、turboc では、ポインターは常に 2 バイトです。.しかし、オプション>>コンパイラ>>モデルの下の設定を変更し、それを巨大に設定した場合。次に、2 つのレジスタを使用して 1 MB のアドレス空間まで完全に拡張します。2 バイトの場合、ポインタは 4 バイトになるか、または 4 バイトになります

于 2013-03-26T12:23:29.297 に答える