2009-07-18 8 views
8

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

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

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

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

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

Спасибо.

ответ

0

Это:

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

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

3

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

echo (int)3232240316 . "\n"; 

дает

-1062726980 

Примечание: если вы хотите, чтобы бросить подписанную Int в беззнаковое междунар в PHP, просто сделать это:

$number += 4294967296; 

Пример:

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

дает:

-1062726980 
3232240316 
+1

Извините, но это не сработает на некоторых 64-битных системах, где по умолчанию используется PHP-int. – Alex