WORD_BITとLONG_BIT

WORD_BITとLONG_BIT

WORD_BITこれらとそしての違いは何ですかLONG_BIT?自分のシステムの単語サイズを調べるには、どちらを使用する必要がありますか?どちらも異なる結果を返します。

➜  ~ getconf LONG_BIT
64
➜  ~ getconf WORD_BIT
32
➜  ~ 

私はまた単語のサイズを調べる信頼できる方法はスペースのサイズを印刷することである他の記事を読んだ。これは8バイトになります。

printf("%d\n", (int)sizeof(void*)); 

これは常に返された結果と同じですかgetconf LONG_BIT

申し訳ありません。別の質問があります。単語の長さは CPU アーキテクチャに関連しています。オペレーティングシステムは、CPUアーキテクチャで定義されているのと同じ単語の長さでも実行できますか?

答え1

POSIXの定義WORD_BITLONG_BITintはそれぞれおよびタイプのオブジェクト内のビット数ですlong。型オブジェクトのサイズは、void *データへのポインタのサイズです。

32ビットintおよび64ビットlongおよびポインタは、64ビットx86ベースのLinuxの標準モデルです。これをLP64と呼びます(System V ABIのAMD64拡張を参照)。

これらのサイズの間には関係はありません。 Cが提供する唯一のサイズ平等保証はsizeof(char)1です。たとえば、x64ベースのWindowsは32ビットlongint64ビットのポインタを使用します。 (異なるサイズ要件があります。Cはsizeof(short)≤≤ 、合計が最小16ビット、合計が最小32ビットであることを保証します。POSIXでは、合計長は少なくともsizeof(int)32ビットでなければなりません。)sizeof(long)shortintlongintlong

オペレーティングシステムとCPUを一致させる点で最も重要なオブジェクトサイズは、ポインタサイズ(どのように処理してintコンパイラlongの主な関心事なのか)ですが、オペレーティングシステムとCPUポインタサイズの関係は必ずしも単純ではありません。オペレーティングシステムはポインタサイズを使用する必要があります。サポートCPU によって決まりますが、CPU は複数のポインタサイズをサポートできます。たとえば、64ビットx86 CPU²は、64ビットオペレーティングシステム(Windows x64、64ビットLinuxなど)、32ビットオペレーティングシステムを実行できます。 (Windows x32、32ビットLinux、OS / 2など)および16ビットオペレーティングシステム(MS-DOSなど)。 64ビットオペレーティングシステムでも上記のように違いがある可能性があり(Windows x64では32ビットlong、64ビットlongLinuxでは64ビット)、さらに「デフォルト」ポインタサイズも期待したものと異なる場合があります(Linuxx32 ABIユーザー空間で32ビットポインタを使用するSPARC)。歴史的に、64ビットAlphaプラットフォームにリリースされたWindowsバージョンは32ビットオペレーティングシステムでした。


1一部の環境(私が知っている限りUnix以外の環境)では、データへのポインタは関数へのポインタと必ずしも同じサイズではありません。

² Intelがリリースされるまで適切なファームウェアサポートX86SCPU。

答え2

いくつかの追加情報を追加するには、「ポインタサイズ」というフレーズがあいまいです。内部にx86メモリモデル「中型」および「コンパクト」モデルは、データポインタのサイズとコードポインタのサイズが異なります。型はvoid *データへのポインタを表します。

関連情報