揮発性のメモ2

http://d.hatena.ne.jp/iww/

文字列 "90000000" を 0x90000000 と認識させる

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