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

StackOverflow https://stackoverflow.com/questions/1147512

Вопрос

У меня есть строка в 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

Это:

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

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

Другие советы

Если вы просто преобразуете число в целое число в PHP, это сделает свое дело.

echo (int)3232240316 . "\n";

дает

-1062726980

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

$number += 4294967296;

Пример:

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

дает:

-1062726980
3232240316
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top