Como converter um inteiro de 32-bit de não assinado para assinado em MySQL ou PHP?
Pergunta
Eu tenho uma string em PHP (veio de alguma fonte de dados), o que representa um número inteiro de 32 bits sem sinal formatado. Eu preciso para armazená-lo em um banco de dados MySQL como um 32-bit inteiro assinado, para que mais tarde eu posso recuperá-lo de PHP e usá-lo como um (possivelmente negativo) constante inteiro assinado (desde o PHP doesn' t têm inteiros sem sinal).
Então, o que eu preciso é um método de conversão, tanto para PHP e MySQL. Não deve ser-plataforma dependente (sem problemas endian / 32/64-bit).
Eu sei como converter um inteiro assinado em não assinado usando o MySQL:
select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
| 3232240316 |
+------------------------------------------------------+
Mas eu não posso obtê-lo trabalhar o contrário. (Nota: MySQL usa aritmética de 64 bits ao fazer moldes)
Graças.
Solução 2
Este:
$val = (bccomp("2147483647", $val) < 0) ? bcsub($val, "4294967296") : $val;
parece funcionar, mesmo que seja um pouco lento.
Outras dicas
Se você acabou de depositar o número para um inteiro no PHP, ele irá fazer o truque.
echo (int)3232240316 . "\n";
dá
-1062726980
Nota: se você quiser lançar um int assinado para um int não assinado em PHP, basta fazer o seguinte:
$number += 4294967296;
Exemplo:
$number = -1062726980;
echo $number . "\n";
$number += 4294967296;
echo $number . "\n";
dá:
-1062726980
3232240316