2009-07-18 23 views
8

Tengo una cadena en PHP (proviene de alguna fuente de datos), que representa un entero formateado sin signo de 32 bits. Necesito almacenarlo en una base de datos MySQL como con signo entero de 32 bits, para que luego pueda recuperarlo de PHP y usarlo como una constante entera con signo (posiblemente negativa) (ya que PHP no tiene enteros sin signo))Cómo convertir un entero de 32 bits de unsigned a firmado en MySQL o PHP?

Entonces, lo que necesito es un método de conversión, ya sea para PHP o MySQL. No debe depender de la plataforma (sin problemas endian/32/64-bit).

sé cómo convertir un entero sin signo en el uso de MySQL:

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

pero no puedo conseguir que funcione a la inversa (nota: MySQL usa la aritmética de 64 bits al hacer moldes).

Gracias.

Respuesta

0

Este:

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

parece que funciona, aunque es algo lento.

3

Si acaba de convertir el número a un número entero en PHP, hará el truco.

echo (int)3232240316 . "\n"; 

da

-1062726980 

Nota: si desea emitir un int firmado a un entero sin signo en PHP, simplemente hacer esto:

$number += 4294967296; 

Ejemplo:

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

da:

-1062726980 
3232240316 
+1

Lo sentimos, pero eso no funcionará en algunos sistemas de 64 bits, donde PHP int es de 64 bits de manera predeterminada. – Alex

Cuestiones relacionadas