少し前まで、誰かがlong
は64ビットマシンでは64ビットではないので、常にint
を使用する必要があると言っていました。これは私には意味がありませんでした。私は、Appleの公式サイトにあるようなドキュメントを見て、64ビットCPU用にコンパイルする場合、long
は実際には64ビットであると言っています。私はそれが64ビットWindowsで何であるかを調べて見つけました
- Windows:
long
とint
は32ビット長のままで、特別な新しいデータ型が64ビット整数用に定義されています。
( http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 から)
何を使うべきですか? Windowsではない場合はuw
、sw
((un)signed width)のようなものをlong
として定義し、それ以外の場合はターゲットCPUのビットサイズをチェックする必要がありますか?
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ビットマシンの整数データ型のサイズにはさまざまなシステムがあります。それに慣れる;世界は変わりません。
質問がMicrosoft C++コンパイラに関するものなのか、Windows APIに関するものなのかは明らかではありません。ただし、[c ++]タグはないので、Windows APIに関するものだと思います。いくつかの答えはリンクの腐敗に苦しんでいるので、腐敗する可能性のある別のリンクを提供しています。
INT
、LONG
などのWindows APIタイプについては、MSDNに次のページがあります。
この情報は、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」は、署名済み/未署名を示します。
MSDNのこの記事は、幅に関してもう少し明確な(Windowsで使用可能な)多くのタイプエイリアスを参照しています。
http://msdn.Microsoft.com/en-us/library/aa505945.aspx
たとえば、ULONGLONGを使用して64ビットの符号なし整数値を参照できますが、UINT64も使用できます。 (ULONGとUINT32についても同じことが言えます。)これらは少し明確になるでしょうか?
Microsoftは、ポインターと同じサイズの整数に対してUINT_PTRおよびINT_PTRも定義しています。
Microsoft固有のタイプのリスト -これはドライバーリファレンスの一部ですが、一般的なプログラミングにも有効だと思います。
コンパイラ/プラットフォームでそれを知る最も簡単な方法:
#include <iostream>
int main() {
std::cout << sizeof(long)*8 << std::endl;
}
8の乗算は、バイトからビットを取得することです。
特定のサイズが必要な場合、多くの場合、ライブラリの定義済みタイプのいずれかを使用するのが最も簡単です。それが望ましくない場合は、autoconfソフトウェアで頻繁に発生することを実行し、構成システムに必要なサイズに適したタイプを決定させることができます。
特定の長さの整数を使用する必要がある場合は、おそらくプラットフォームに依存しないヘッダーを使用してください。 Boostは、見るのに適した場所です。