Question

I ai une chaîne en PHP (provenait d'une source de données), qui représente un nombre entier non signé au format 32 bits. Je dois stocker dans une base de données MySQL en tant que signé entier 32 bits, de sorte que plus tard, je peux le récupérer à partir de PHP et l'utiliser comme un (éventuellement négatif) signé entier constant (depuis PHP n » t ont des nombres entiers non signés).

Alors, ce que j'ai besoin est une méthode de conversion, que ce soit pour PHP ou MySQL. Il ne devrait pas dépendre de la plate-forme (pas endian / 32/64-bit problèmes).

Je sais comment convertir un entier signé en utilisant MySQL non signé:

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

Mais je ne peux pas le faire fonctionner dans l'autre sens. (Note: MySQL utilise l'arithmétique 64 bits lorsque vous faites des moulages)

Merci.

Était-ce utile?

La solution 2

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

semble fonctionner, même si elle est un peu lent.

Autres conseils

Si vous venez exprimer le nombre à un nombre entier en PHP, il fera l'affaire.

echo (int)3232240316 . "\n";

donne

-1062726980

Remarque: si vous voulez jeter un entier signé un entier non signé en PHP, faire ceci:

$number += 4294967296;

Exemple:

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

donne:

-1062726980
3232240316
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top