unsigned __int64
読み:アンサインド-アンダースコア-アンダースコア-イント-ろくじゅうよん
外語:unsigned __int64

 CおよびC++における非標準の変数型で、符号なしの64ビット長の整数を宣言する。
 Microsoft C/C++やBorland C++Builder、その他の環境でこの変数型に対応している。
目次

概要
 物理的なサイズが明示された変数型であるため、異なるプラットフォーム間での移植性が向上するらしい。
 ISO C++には相当する型がない。
 GCCでは、unsigned long long型が事実上対応すると考えられる(但し、64ビット長という保証はない)。

特徴

32ビット環境でも利用可
 64ビット長の変数であるが、32ビット環境(Win32)でも使用できる。
 64ビット環境ならレジスター1本で済むが32ビットではそうはいかないので、メモリーを介した演算として内部で処理されている。従って、演算の手間が多いことから処理速度は遅いと考えられる。
 実際に、unsigned __int64に対応したVisual C++での32ビット環境での出力を例に挙げる。
 unsigned __int64 num;
 num = 0x1122334455667788ui64;
 上の、__int64変数への代入は、下のように出力される。
 _num$ = -8
 mov DWORD PTR _num$[ebp], 1432778632
 mov DWORD PTR _num$[ebp+4], 287454020
 次に、この変数のインクリメントを例とする。
 num++;
 上の、インクリメントは、下のように出力される。
 mov eax, DWORD PTR _num$[ebp]
 add eax, 1
 mov ecx, DWORD PTR _num$[ebp+4]
 adc ecx, 0
 mov DWORD PTR _num$[ebp], eax
 mov DWORD PTR _num$[ebp+4], ecx
 このように、内部では32ビット×2で処理されていることが分かる。
 なお、Visual C++の場合、unsigned __int64もunsigned long longも、(確認した範囲では)全く同じコードを出力している。

サフィックス
 数値の型を表わすサフィックスは、非標準だが次のものが使われる。

printf
 printfのフォーマット文字列は、次のようなものを用いる。
 Microsoft Visual C++ 2003では、%llx等では値を正常に表示できない。Microsoftの実装で対応するのはMicrosoft Visual C++ 2005以降である。

マクロ定数
 limits.hにおいて以下の3個のマクロ定数が定義されている。これを利用すると、その環境での長さを得ることができる。
_UI64_MAX
unsigned __int64型の最大値 (例えば0xffffffffffffffffui64)
_I64_MIN
__int64型の最小値 (例えば-9223372036854775807i64 - 1)
_I64_MAX
__int64型の最大値 (例えば9223372036854775807i64)

関連
 Delphi(Pascal)では、signed __int64はInt64型が対応する。unsigned __int64は恐らく対応型が無い。

再検索