ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
Microsoft C/C++が独自拡張で定義した予約語で、64ビット長の符号付き整数を宣言する。C/C++非標準の変数型だが、Borland C++Builder、その他の環境でこの変数型に対応している。
物理的なサイズが明示された変数型であるため、異なるプラットフォーム間での移植性が向上するらしい。
符号無しはunsigned __int64とすることで使用できる。
C/C++標準およびGCCでは、一般的な型ではlong long型が事実上対応すると考えられる(但し、64ビット長という保証はない)。また、C99とC++11からはint64_t(およびuint64_t)が相当する型として実装依存として追加されており、実装によって追加することが認められている。
なお、古いVisual C++(Visual Studio 6.0など)では、__int64 には対応するが long long は未対応である。
64ビット長の変数であるが、32ビット環境(Win32)でも使用できる。
64ビット環境ならレジスター1本で済むが32ビットではそうはいかないので、メモリーを介した演算として内部で処理されている。従って、演算の手間が多いことから処理速度は遅いと考えられる。
実際に、__int64に対応したVisual C++での32ビット環境での出力を例に挙げる。
__int64 num;
num = 0x1122334455667788i64;
上の、__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++の場合、__int64もlong longも、(確認した範囲では)全く同じコードを出力している。
数値の型を表わすサフィックスは、非標準だが次のものが使われる。
printfのフォーマット文字列は、次のようなものを用いる。
Microsoft Visual C++ 2003では、%llx等では値を正常に表示できない。Microsoftの実装で対応するのはMicrosoft Visual C++ 2005以降である。
__int64は、標準ではsignedである。
unsigned __int64として使用すると、符号無しの64ビット長変数となる。
limits.hにおいて以下の3個のマクロ定数が定義されている。これを利用すると、その環境での長さを得ることができる。
Delphi(Pascal)では、signed __int64はInt64型が対応する。unsigned __int64は恐らく対応型が無い。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます