如何在MySQL或PHP中将32位整数从无符号转换为有符号?

问题描述 投票:9回答:3

我在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 mysql casting unsigned signed
3个回答
3
投票

如果您只是将数字转换为PHP中的整数,它将可以解决问题。

echo (int)3232240316 . "\n";

给予

-1062726980

注意:如果要在PHP中将一个有符号的int转换为一个无符号的int,只需执行以下操作:

$number += 4294967296;

示例:

$number = -1062726980;
echo $number . "\n";
$number += 4294967296;
echo $number . "\n";

给予:

-1062726980
3232240316

0
投票

此:

$val = (bccomp("2147483647", $val) < 0) ? bcsub($val, "4294967296") : $val;

尽管有些慢,但似乎可以正常工作。


0
投票
SELECT CAST((yourUnsigned<<32) AS SIGNED)/(1<<32)

yourUnsigned处于0..4294967295范围内时,为您提供32位补码UNSIGNED-> SIGNED转换。 SIGNED-> UNSIGNED很简单:

SELECT yourSigned & 0xFFFFFFFF;
© www.soinside.com 2019 - 2024. All rights reserved.