printfの%u(引数を整数として扱い、符号無しの 10 進数として表現)に小数を含む数値を入れると丸められたり、文字列を入れようとすると0になったりするのは知ってましたが、負の値を入れると42億9496万...なんというべらぼうにでかい数字とであうことになるとは知りませんでした。負の数は0にしてくれても良さそうなものですが。
for ( $i = 0 ; $i >= -10 ; $i-- ) {
printf($i.'を%%uに代入すると%uになっちゃいます。<br />', $i);
}
実行結果
0を%uに代入すると0になっちゃいます。 -1を%uに代入すると4294967295になっちゃいます。 -2を%uに代入すると4294967294になっちゃいます。 -3を%uに代入すると4294967293になっちゃいます。 -4を%uに代入すると4294967292になっちゃいます。 -5を%uに代入すると4294967291になっちゃいます。 -6を%uに代入すると4294967290になっちゃいます。 -7を%uに代入すると4294967289になっちゃいます。 -8を%uに代入すると4294967288になっちゃいます。 -9を%uに代入すると4294967287になっちゃいます。 -10を%uに代入すると4294967286になっちゃいます。
4294967296が32ビットで切りが良いので、きっとPHPの限界から差を求める仕様になってるんだと思われます。
トラバURL : http://suin.asia/trackback/6
氷川 XOOPS Module 開発室