32bit環境だとintval系はうまく変換できないので、0を足して暗黙の型変換をするか hexdec()という関数を使う
ダメなパターン
<? printf("0x%08X\n", intval("90000001",16) ); // intvalで変換 // 32bit環境: 0x7FFFFFFF ← intの最大値になる // 64bit環境: 0x90000001 printf("0x%08X\n", "0x90000001"); // 頭に0xをつけた文字列 // 32bit環境: 0x00000000 ← 理不尽 // 64bit環境: 0x00000000 printf("0x%08X\n", (int)"0x90000001"); // (int)でキャスト // 32bit環境: 0x00000000 // 64bit環境: 0x00000000
いけるパターン
<? printf("0x%08X\n", hexdec("90000001")); // hexdec()を使う // 32bit環境: 0x90000001 // 64bit環境: 0x90000001 printf("0x%08X\n", hexdec("0x90000001")); // 頭に0xがついてても大丈夫 // 32bit環境: 0x90000001 // 64bit環境: 0x90000001 printf("0x%08X\n", "0x90000001"+0); // 0xをつけた文字列に、数値の0を足す // 32bit環境: 0x90000001 // 64bit環境: 0x90000001 printf("0x%08X\n", "0x90000001"+"0x90000001"); // 暗黙の型変換さえあれば良い // 32bit環境: 0x20000002 // 64bit環境: 0x120000002