Как преобразовать 32-разрядное целое число из неподписанного в подписанное в MySQL или PHP? - PullRequest
8 голосов
/ 18 июля 2009

У меня есть строка в PHP (пришедшая из некоторого источника данных), которая представляет собой отформатированное 32-разрядное целое число без знака. Мне нужно сохранить его в базе данных MySQL в виде знакового 32-разрядного целого числа, чтобы позже я мог извлечь его из PHP и использовать его в качестве (возможно, отрицательной) целочисленной константы со знаком (так как PHP не имеют целые числа без знака).

Итак, мне нужен метод конвертации для PHP или MySQL. Он не должен зависеть от платформы (без проблем с порядком байтов / 32/64-бит).

Я знаю, как преобразовать целое число без знака с помощью MySQL:

select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
|                                           3232240316 | 
+------------------------------------------------------+

Но я не могу заставить его работать наоборот (примечание: MySQL использует 64-битную арифметику при выполнении приведения).

Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 июля 2009

Если вы просто приведете число к целому числу в PHP, это поможет.

echo (int)3232240316 . "\n";

дает

-1062726980

Примечание: если вы хотите преобразовать подписанное int в unsigned int в PHP, просто сделайте это:

$number += 4294967296;

Пример:

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

дает:

-1062726980
3232240316
0 голосов
/ 19 июля 2009

Это:

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

, кажется, работает, хотя и несколько медленно.

...