150

long少し前に、は 64 ビット マシンでは 64 ビットではなく、常に使用する必要があると誰かが私に言いましたint。これは私には意味がありませんでした。ドキュメント (Apple の公式サイトなど)longで、64 ビット CPU 用にコンパイルすると実際に 64 ビットであると書かれているのを見たことがあります。64 ビット Windows での動作を調べたところ、

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

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

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

4

7 に答える 7

277

Unix の世界では、64 ビット プラットフォームの整数とポインターのサイズについていくつかの取り決めがありました。主に広く使用されている 2 つは、ILP64 (実際には、この例はごくわずかです。Cray はそのような例の 1 つです) と 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、ポインターは 64 ビットです」)。これには、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 ビット マシンの整数データ型のサイズにはさまざまなシステムがあります。それに慣れる; 世界は変わらない。

于 2008-12-21T17:03:11.003 に答える
61

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


INTなどのWindowsAPIタイプについてLONGは、MSDNに次のページがあります。

Windowsのデータ型

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

タイプ| S / U | x86 | x64
---------------------------- + ----- + -------- + ------ -
BYTE、BOOLEAN | U | 8ビット| 8ビット
---------------------------- + ----- + -------- + ------ -
ショート| 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ビット
---------------------------- + ----- + -------- + ------ -
ロングロング| S | 64ビット| 64ビット
ULONGLONG、QWORD | U | 64ビット| 64ビット

「S/U」列は、符号付き/符号なしを示します。

于 2012-08-18T23:39:43.343 に答える
4

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

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

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

于 2008-12-21T14:30:41.513 に答える
4

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

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

于 2008-12-21T16:01:15.373 に答える
2

コンパイラ/プラットフォームでそれを知る最も簡単な方法は次のとおりです。

#include <iostream>

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

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

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

于 2008-12-21T15:01:22.997 に答える
-3

特定の長さの整数を使用する必要がある場合は、プラットフォームに依存しないヘッダーを使用する必要があります。ブーストは、見るのに適した場所です。

于 2008-12-21T14:13:19.317 に答える