64ビット対応
何が問題か?
C言語/C++では、標準の型(char, short, int, long, long long)のサイズは実装依存になっている。
型のサイズは以下の条件であることが要請されている。
char >= 8bit, short >= 16bit, int >= 16bit, long >= 32bit, long long >= 64bit
char > short >= int >= long >= long long
8bit 単位であることは要請されていないが、事実上標準になっている。
32bit と 64bit とでこの型のサイズが食い違っているため、非互換になってしまっている。
int 型が 16bit、32bit、64bit の可能性がある。
long 型が 32bit と 64bit の可能性がある。
型のサイズが変わっても問題ないように設計されていればよいが、かなりのプログラムはそうなっていない。
どういうパターンが存在するか
table:model
IP16 LP32 ILP32 LLP64 LP64 ILP64
int 16 16 32 32 32 64
long 32 32 32 32 64 64
long long - 32 64 64 64 64
pointer 16/32 32 32 64 64 64
32ビット Windows, Linux は ILP32
64ビット Windows は LLP64
ポインタを int 型にキャストしている部分
構造体にポインタを含んでいる部分
64ビット Linux, FreeBSD, OSX は LP64
ポインタを int 型にキャストしている部分
構造体にポインタと long 型を含んでいる部分
table:size
32bit 64bit
0x00000000 0x0000000000000000
0 0
0xffffffff 0xffffffffffffffff
4,294,967,295
0x80000000 0x8000000000000000
−2,147,483,648
0x7fffffff 0x7fffffffffffffff
2,147,483,647
通常変わらないと考えられるもの
table:common
char 8
short 16
float 32
double 64
long double 80