[PHP] 16進数表現の罠


PHP5までは特に問題なかったところ、PHP7に移行して(今更)発覚した問題。

huh.php
<?php
var_dump(dechex(0xfedcba9876543210));

string(16) "fedcba9876543000"

…はぅ?

omg.php
<?php
var_dump(0xfedcba9876543210);

float(1.8364758544493E+19)

まさかのfloat。

max.php
<?php
var_dump(0x7fffffffffffffff);

int(9223372036854775807)

正数なら問題ないらしい不思議。

shift.php
<?php
var_dump(1<<63);

int(-9223372036854775808)

シフト演算で突き押し作戦。

ok.php
<?php
var_dump(dechex(0xf<<60|0xedcba9876543210));

string(16) "fedcba9876543210"

強引に解決。

PHP8では…

huh.php
<?php
var_dump(dechex(0xfedcba9876543210));

Fatal error: Uncaught TypeError: dechex(): Argument #1 ($num) must be of type int, float given

叱られた…

ok.php
<?php
var_dump(dechex(0xf<<60|0xedcba9876543210));

string(16) "fedcba9876543210"

原因は同じなので、同じく強引に解決可。