Twitterの「ユーザーID」が32ビットを超える、アプリ開発者などは確認を -INTERNET Watch Watch と言う記事を読みながら「そう言えば C とか C++ 以外のプログラミング言語は long が 64bit と言う保証はあるのだろうか」と言う事が気になったので、64bit 整数の対応状況について調べてみました。
C, C++(, Objective-C++)
Objective-C++ はよく分からなかったので括弧扱い。C や C++ の long は「32bit 以上」が保証されているだけで詳細は実装依存と言う扱いになっています。ただし、C99, C++11 でそれぞれ「64bit 以上」を保証する long long (int) が定義されました。また、これに加えて「64bit の整数」を表す int64_t も定義されたので、long の代わりにこれらの型を使用する事で 64bit 整数を扱う事ができます(実装するかどうかは処理系依存?)。それ以外だと、Visual C++ 辺りでは __int64 と言う独自拡張もよく使用されていました(されている?)。
- プログラミング言語 C の新機能 (5.2 long long int 型、および 9.5 stdint.h)
- C++11 - Wikipedia (6.7 long long int 型)
- https://sites.google.com/site/cpprefjp/reference/cstdint
Java, C#
Java と C# では言語仕様で「long は 64bit 整数を表す」と明確に規定されているようです。尚、C# については「long は System.Int64 の別名」と言う扱いとの事。これまで何となく明確にビット長が問題になる時は System.Int64 の方を使用していたのですが、言語仕様としても、どちらでも変わらない感じなのですね。
Perl, Ruby, Python
Perl は use bigint; と宣言する事で 64bit 整数にも対応できるようになるそうです。Ruby と Python は必要に応じて整数型と多倍長整数型のどちらかに自動的に割り当てられるようなので、多くの場合はあまり意識しなくても良さそうです。
JavaScript
JavaScript は数値は 64bit の浮動小数点型で扱っているため、整数については通常 53bit までしか正常に扱えないそうです。これを補う形としてか、いろいろな人が bigint.js 的な多倍長整数を扱うライブラリを作成して公開していたりもします。この他、冒頭の Twitter ユーザ ID については API のレスポンスに「id_str」と言う文字列を追加したので問題がある場合はそちらを使用する、と言う形で対策が取られているようです。
補足:データモデル
C や C++ 等のように実装依存の場合、実際にどんなビット長が割り当てられているかについては LP32, LP64, ... 等と呼称されているデータモデルに従うようです。各データモデルと実際のビット長の対応関係は以下のようになっています(参考:64ビット - Wikipedia)。
データモデル | short | int | long | long long | ポインタ | 備考 |
---|---|---|---|---|---|---|
C99,C++11 | 16↑ | 16↑ | 32↑ | 64↑ | - | - |
LLP64 | 16 | 32 | 32 | 64 | 64 | Microsoft Win64 (X64/IA64) |
LP64 | 16 | 32 | 64 | 64 | 64 | Unix 系 OS (Solaris, Linux, etc.) |
IP64 | 16 | 64 | 32 | 64 | 64 | - |
ILP64 | 16 | 64 | 64 | 64 | 64 | HAL |
SILP64 | 64 | 64 | 64 | 64 | 64 | - |
ILP32 | 16 | 32 | 32 | 64 | 32 | 一般的な 32bit 環境 |
LP32 | 16 | 16 | 32 | 64 | 32 | - |
- | 16 | 16 | 32 | - | 16 | 一般的な 16bit 環境 |