64ビットWindowsのlongのビットサイズは何ですか?


137

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

  • Windowsの場合:longとは、int長さが32ビットのままで、そして特殊な新しいデータ型は、64ビット整数のために定義されています。

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

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


MSVC ++を使用するWindowsでは、intおよびlongは32ビットです:msdn.microsoft.com/en-us/library/3b2e7499.aspx。ただし、たとえばベクターに4Gを超えるアイテムを格納できるようにするため、size_tは64ビットです。したがって、たとえば4Gを超えるアイテムを含む可能性のあるベクトルを反復するには、intではなくint64_tを使用する必要があります。
セルジュロガッチ2015年


彼らが使用する必要があります@SergeRogatch size_tまたはイテレータ型反復するために、ではないintint64_t
phuclv

2
@LưuVĩnhPhúcは、符号なしsize_tであるため、負の数の近くではトリッキーになりsize_tます。そのfor(size_t i=0; i<v.size()-2; i++)ため、ベクターサイズ0と1 では失敗します。別の例:for(size_t i=v.size()-1; i>=0; i--)
セルジュ・ロガッチ2017

2
ポインターでsize_t計算を行う場合(つまり、値を使用する場合)、結果はptrdiff_t型の変数に保持する必要があります。これは、そのような結果を保持するのに十分な大きさに設計されており、まさにそのための符号付き型です!)
SlySven

回答:


260

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を支持して放棄されました(つまり、アスペングループの推奨事項に基づいて、ほとんどすべての後の参加者がLP64を使用しました。64ビット操作の長い遺産を持つシステムのみが異なるスキームを使用します)。最新の64ビットUnixシステムはすべてLP64を使用しています。MacOS XとLinuxはどちらも最新の64ビットシステムです。

Microsoftは、64ビットへの移行に別のスキームを使用しています:LLP64(「長い、ポインターは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ビットマシンの整数データ型のサイズにはさまざまなシステムがあります。それに慣れる; 世界は変わりません。


12
十分に長い間使用されてきたユーザーにとって、64ビットの移行は、80年代半ばの16ビットから32ビットへの移行といくつかの類似点があります。IL32であるコンピューターとL32であるコンピューターがありました(古い問題に新しい表記法を採用)。「int」は16ビットの場合もあれば、32ビットの場合もありました。
ジョナサンレフラー

4
これはC言語にのみ当てはまることを忘れないでください。他のユーザーは、a)コンパイラの作成者がデータ型のサイズを自由に選択することを許可されていない、またはb)データ型の物理表現が「リークしない」、またはc)整数が常に無限大であるような、より適切な仕様を持っています。
イェルクWミッターク

2
正しい-ただし、動作を指定する言語の場合、そもそも問題はありません。たとえば、Javaには「長い」機能がありますが、すべてのプラットフォームでサイズは固定(64ビット?)です。したがって、64ビットマシンへの移植に問題はありません。サイズは変わりません。
ジョナサンレフラー

17
@TomFobear:ILP64には大きな問題が1つあります。32ビットタイプを何と呼びますか。または、32ビットタイプshortを呼び出す場合、16 ビットタイプを何と呼びますか?またchar、UTF-16などの16 ビットタイプを呼び出す場合、8ビットタイプを何と呼びますか?したがって、LP64を使用すると、8ビットchar、16ビットshort、32ビットint、64ビットlonglong longなり、関連する場合(ある場合)に128ビットに上方拡張する余地があります。その後、Cでの名前よりも256の累乗が多くなります(まあ、256ビットを使用できるとしたら、それで使い果たせますintmax_t)。LP64にはメリットがあります。
ジョナサンレフラー

2
多分これは皆さんには明白ですが、C#が他のすべてとは異なる整数サイズを使用していることに注目する価値があると思います。C#は64ビットlong(msdn.microsoft.com/en-us/library/ms173105.aspx)を使用しているため、最近DLLとのインターフェイスが作動しました。
Compholio 2013

57

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


以下のようなWindows APIのタイプについてはINTLONGその他ページにはMSDNにあります:

Windowsデータ型

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

タイプ| S / U | x86 | x64
---------------------------- + ----- + -------- + ------ -
BYTE、BOOLEAN | 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」の列は、署名済み/未署名を示します。


4

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

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

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


1
uint32_tとDWORDが交換可能であるという保証はありますか?[前者が32ビットintで後者が32ビットであるlong場合、gccは、ある型へのポインターは、一致する表現にもかかわらず他の型にエイリアスできないと想定します]とは想像に難くないでしょう。
スーパーキャット2016年


2

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

#include <iostream>

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

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

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


4
重要ではありませんが、8ビットバイトは実際にはC仕様の一部ではありません(C標準の3.6節と5.2.4.2.1節)。8ビットではないマシンを見つけるのは難しいですが、LONG_BITをチェックして、長いデータ型の大きさを確認できます。
アンドレス

もちろん、あなたは正しいですが、それは実際にはアーキテクチャに依存します(「実行環境の基本的な文字セットのメンバーを保持するのに十分な大きさのデータストレージのアドレス指定可能な単位」)が、最も一般的に使用されるアーキテクチャは8ビットです。
ポールドヴリーズ2009年

しかし、OPは彼のコンパイラ/プラットフォームについて尋ねませんでした。彼は64ビットWindowsについて具体的に尋ねました—おそらく彼 64ビットWindowsシステムにテストするための便利なアクセスがないためです。
Quuxplusone 2013

0

longWindowsプラットフォームでのビット単位のサイズは32ビット(4バイト)です。

これはを使用して確認できsizeof(long)ます。


-2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.