我在PHP中有一个字符串(来自某些数据源),它表示格式化的无符号32位整数。我需要将其作为signed 32位整数存储到MySQL数据库中,以便以后可以从PHP检索它并将其用作(可能为负数)有符号整数常量(因为PHP没有未签名的)整数)。
因此,我需要一种针对PHP或MySQL的转换方法。它不应该依赖于平台(无字节序/ 32/64位问题)。
我知道如何使用MySQL将有符号整数转换为无符号整数:
select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
| 3232240316 |
+------------------------------------------------------+
但是我无法以其他方式使它起作用(注意:MySQL在进行强制转换时使用64位算术)。
谢谢。
如果您只是将数字转换为PHP中的整数,它将可以解决问题。
echo (int)3232240316 . "\n";
给予
-1062726980
注意:如果要在PHP中将一个有符号的int转换为一个无符号的int,只需执行以下操作:
$number += 4294967296;
示例:
$number = -1062726980;
echo $number . "\n";
$number += 4294967296;
echo $number . "\n";
给予:
-1062726980
3232240316
此:
$val = (bccomp("2147483647", $val) < 0) ? bcsub($val, "4294967296") : $val;
尽管有些慢,但似乎可以正常工作。
SELECT CAST((yourUnsigned<<32) AS SIGNED)/(1<<32)
当yourUnsigned
处于0..4294967295范围内时,为您提供32位补码UNSIGNED-> SIGNED转换。 SIGNED-> UNSIGNED很简单:
SELECT yourSigned & 0xFFFFFFFF;