Come lanciare un intero a 32 bit senza segno dal al firmato a MySQL o PHP?
Domanda
Ho una stringa in PHP (è venuto da una sorgente di dati), che rappresenta un senza segno a 32 bit intero formattato. Ho bisogno di memorizzare in un database MySQL come firmato intero a 32 bit, in modo che poi posso recuperare da PHP e usarlo come una (possibilmente negativo) hanno firmato integer costante (da PHP doesn' t avere interi senza segno).
Allora, che cosa ho bisogno è un metodo di conversione, sia per PHP o MySQL. Non dovrebbe essere dipendente dalla piattaforma (nessun endian / 32 / problemi a 64 bit).
Io so come convertire un intero con segno in unsigned utilizzando MySQL:
select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
| 3232240316 |
+------------------------------------------------------+
Ma io non riesco a farlo funzionare il contrario. (Nota: MySQL utilizza 64 bit aritmetica quando si fa calchi)
Grazie.
Soluzione 2
Questa:
$val = (bccomp("2147483647", $val) < 0) ? bcsub($val, "4294967296") : $val;
sembra funzionare, anche se è un po 'lento.
Altri suggerimenti
Se hai appena lanci il numero in un intero in PHP, esso farà il trucco.
echo (int)3232240316 . "\n";
dà
-1062726980
Nota: se si vuole lanciare un int firmato per un unsigned int in PHP, basta fare questo:
$number += 4294967296;
Esempio:
$number = -1062726980;
echo $number . "\n";
$number += 4294967296;
echo $number . "\n";
dà:
-1062726980
3232240316