Maison  >  Article  >  développement back-end  >  Introduction détaillée au dépassement de conversion forcé d'entiers longs dans le système PHP 32 bits

Introduction détaillée au dépassement de conversion forcé d'entiers longs dans le système PHP 32 bits

黄舟
黄舟original
2017-07-17 15:35:162555parcourir

CleverCode a récemment rencontré un problème de conversion plastique du projet PHP. mysql a un identifiant de champ qui est bigint et contient un entier long, tel que id = 5147486396. Cependant, le code php est déployé sur plusieurs machines pour des raisons historiques, parmi lesquelles la machine A est un système 32 bits et la machine B est un système 64 bits. Le problème est maintenant que l'accès aux pages est normal dans le système 64 bits. Erreur d'accès dans le système 32 bits. La raison est le débordement de mise en forme de PHP.

1 Démonstration d'une machine

1.1 Récupérer les bits système d'une machine

# getconf LONG_BIT


1.2 Code de transformation plastique

<?php

$id = 5147486396;
echo &#39;$id:&#39;.$id."\r\n";

$value = (int)$id;
echo &#39;(int)$id:&#39;.$value."\r\n";

$value = intval($id);
echo &#39;intval($id):&#39;.$value."\r\n";

$value = filter_var($id, FILTER_VALIDATE_INT);
echo &#39;filter_var($id, FILTER_VALIDATE_INT):&#39;."\r\n";
var_dump($value);


?>

1.3 Résultats d'exécution

(int)5147486396的结果是852519100,intval(5147486396)的结果是852519100,filter_var(5147486396, FILTER_VALIDATE_INT)结果是false。


Démonstration de la machine 2 B

2.1 Obtenir B Bits du système de machine

# getconf LONG_BIT


2.2 Code de conversion plastique

<?php

$id = 5147486396;
echo &#39;$id:&#39;.$id."\r\n";

$value = (int)$id;
echo &#39;(int)$id:&#39;.$value."\r\n";

$value = intval($id);
echo &#39;intval($id):&#39;.$value."\r\n";

$value = filter_var($id, FILTER_VALIDATE_INT);
echo &#39;filter_var($id, FILTER_VALIDATE_INT):&#39;."\r\n";
var_dump($value);


?>

2.3 Résultat de l'opération

(int)5147486396的结果是5147486396,intval(5147486396)的结果是5147486396,filter_var(5147486396, FILTER_VALIDATE_INT)结果是5147486396。


3 Conclusion

La longueur des mots entiers dépend de la plate-forme, bien que le maximum habituel soit d'environ deux milliards (signé 32 bits) . La valeur maximale sur les plateformes 64 bits est généralement d'environ 9E18. PHP ne prend pas en charge les entiers non signés. Entier La longueur en mot de la valeur peut être représentée par la constante PHP_INT_SIZE Depuis PHP 4.4.0 et PHP 5.0.5, la valeur maximale peut être représentée par la constante PHP_INT_MAX

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn