web-dev-qa-db-ja.com

64ビットWindowsのlongのビットサイズは?

少し前まで、誰かがlongは64ビットマシンでは64ビットではないので、常にintを使用する必要があると言っていました。これは私には意味がありませんでした。私は、Appleの公式サイトにあるようなドキュメントを見て、64ビットCPU用にコンパイルする場合、longは実際には64ビットであると言っています。私はそれが64ビットWindowsで何であるかを調べて見つけました

  • Windows:longintは32ビット長のままで、特別な新しいデータ型が64ビット整数用に定義されています。

http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 から)

何を使うべきですか? Windowsではない場合はuwsw((un)signed width)のようなものをlongとして定義し、それ以外の場合はターゲットCPUのビットサイズをチェックする必要がありますか?

130
user34537

Unixの世界では、64ビットプラットフォーム用の整数とポインターのサイズの取り決めがいくつかありました。主に広く使用されている2つは、ILP64(実際には、これのごく少数の例であり、Crayはそのようなものでした)とLP64(ほとんどすべてのもの)です。頭字語は「int、long、ポインターは64ビット」および「long、ポインターは64ビット」に由来します。

Type           ILP64   LP64   LLP64
char              8      8       8
short            16     16      16
int              64     32      32
long             64     64      32
long long        64     64      64
pointer          64     64      64

ILP64システムは放棄され、 LP64 (つまり、Aspenグループの推奨に基づいて、ほとんどすべてのその後の参加者がLP64を使用しました。64ビット操作の長い遺産を持つシステムのみが、スキーム)。最新の64ビットUnixシステムはすべてLP64を使用しています。 MacOS XとLinuxはどちらも最新の64ビットシステムです。

Microsoftは、64ビットへの移行に別のスキームを使用しています:LLP64( 'long long、pointers are 64-bit')。これには、32ビットソフトウェアを変更せずに再コンパイルできるという意味があります。他のすべての人とは異なるというデメリットがあり、64ビット容量を活用するためにコードを修正する必要があります。常に改訂が必要でした。 Unixプラットフォームで必要なリビジョンとは異なるリビジョンのセットでした。

プラットフォームに中立な整数型名を中心にソフトウェアを設計する場合、おそらくC99 <inttypes.h>ヘッダーを使用します。 「u」):

  • int8_t-8ビット整数
  • int16_t-16ビット整数
  • int32_t-32ビット整数
  • int64_t-64ビット整数
  • uintptr_t-ポインタを保持するのに十分な大きさの符号なし整数
  • intmax_t-プラットフォーム上の整数の最大サイズ(int64_tよりも大きい場合があります)

その後、これらのタイプを重要な場所で使用し、システムタイプ(異なる場合があります)に非常に注意しながら、アプリケーションをコーディングできます。 intptr_t型があります-ポインターを保持するための符号付き整数型です。使用しないか、2つのuintptr_t値(ptrdiff_t)の減算の結果としてのみ使用することを計画する必要があります。

しかし、疑問が(不信感で)指摘しているように、64ビットマシンの整数データ型のサイズにはさまざまなシステムがあります。それに慣れる;世界は変わりません。

244

質問がMicrosoft C++コンパイラに関するものなのか、Windows APIに関するものなのかは明らかではありません。ただし、[c ++]タグはないので、Windows APIに関するものだと思います。いくつかの答えはリンクの腐敗に苦しんでいるので、腐敗する可能性のある別のリンクを提供しています。


INTLONGなどのWindows APIタイプについては、MSDNに次のページがあります。

Windowsデータ型

この情報は、WinDef.hなどのさまざまなWindowsヘッダーファイルでも利用できます。ここにいくつかの関連タイプをリストしました:

タイプ| S/U | x86 | x64 
 ---------------------------- + ----- + -------- + ------- 
バイト、ブール| U | 8ビット| 8ビット
 ---------------------------- + ----- + -------- + ------- 
 SHORT | S | 16ビット| 16ビット
 USHORT、Word | U | 16ビット| 16ビット
 ---------------------------- + ----- + -------- + ------- 
 INT、LONG | S | 32ビット| 32ビット
 UINT、ULONG、DWORD | U | 32ビット| 32ビット
 ---------------------------- + ----- + -------- + ------- 
 INT_PTR、LONG_PTR、LPARAM | S | 32ビット| 64ビット
 UINT_PTR、ULONG_PTR、WPARAM | U | 32ビット| 64ビット
 ---------------------------- + ----- + -------- + ------- 
 LONGLONG | S | 64ビット| 64ビット
 ULONGLONG、QWORD | U | 64ビット| 64ビット

列「S/U」は、署名済み/未署名を示します。

50

MSDNのこの記事は、幅に関してもう少し明確な(Windowsで使用可能な)多くのタイプエイリアスを参照しています。

http://msdn.Microsoft.com/en-us/library/aa505945.aspx

たとえば、ULONGLONGを使用して64ビットの符号なし整数値を参照できますが、UINT64も使用できます。 (ULONGとUINT32についても同じことが言えます。)これらは少し明確になるでしょうか?

4
reuben

Microsoftは、ポインターと同じサイズの整数に対してUINT_PTRおよびINT_PTRも定義​​しています。

Microsoft固有のタイプのリスト -これはドライバーリファレンスの一部ですが、一般的なプログラミングにも有効だと思います。

4
Mark Ransom

コンパイラ/プラットフォームでそれを知る最も簡単な方法:

#include <iostream>

int main() {
  std::cout << sizeof(long)*8 << std::endl;
}

8の乗算は、バイトからビットを取得することです。

特定のサイズが必要な場合、多くの場合、ライブラリの定義済みタイプのいずれかを使用するのが最も簡単です。それが望ましくない場合は、autoconfソフトウェアで頻繁に発生することを実行し、構成システムに必要なサイズに適したタイプを決定させることができます。

2
Paul de Vrieze

特定の長さの整数を使用する必要がある場合は、おそらくプラットフォームに依存しないヘッダーを使用してください。 Boostは、見るのに適した場所です。

0
PolyThinker