2010-09-12 2 views
1

Je souhaitais simplement tester un débordement sur un entier, comme en C (enfin, si c'était juste un entier supérieur à un entier). Quand j'ai regardé pour voir si PHP faisait vraiment ce que je lui ai dit, il semble qu'il échoue pour une raison quelconque. Voici mes tests du problème:PHP: sur le système 32 bits INT_MAX affiche faux?

define('INT_MAX', 0x7FFFFFFF); 
print "In decimal: " . hexdec(INT_MAX) . "<br/>"; 
print "In decimal: " . hexdec(0x7FFFFFFE) . "<br/>"; //Under int_max 
print "In hex: " . dechex(hexdec(INT_MAX)) . "<br/>"; 
print "Float: " . ((bool)is_float(INT_MAX)?'true':'false') . "<br/>"; 

Résultats être:

en décimal: 142929835591
en décimal: 142929835590
En hex: 47483647
Float: faux

Comme je l'ai vu sur le manuel, il va lancer pour flotter si renversé, mais il ne semble pas et est nettement plus élevé. Suis-je fou et manquant quelque chose ici, ou y a-t-il un problème étrange que je devrais vraiment avoir à connaître lorsque je travaille avec hexidecimal en PHP?

Répondre

1
define('INT_MAX', 0x7FFFFFFF); 

Ceci définit INT_MAX être entier 2147483647. Il est inutile de l'interpréter comme un nombre hexadécimal. Si vous voulez vraiment utiliser INT_MAX comme valeur hexadécimale littérale, vous devez le déclarer comme '7FFFFFFF' (à l'intérieur d'une chaîne); alors la fonction hexdec interprétera la notation hexadécimale et la convertira en une valeur décimale.

print(dechex(INT_MAX) . "\n"); 

Ceci imprime "7fffffff".

+0

Je ne savais pas que la notation hexadécimale ne sont stockées en décimal à la fin. Je ne faisais que reconvertir incorrectement l'hexagone, merci! – John

5

Votre programme n'a pas de sens, parce que vous prenez 0x7FFFFFFF qui est 2147483647, puis le traiter comme 0x2147483647, qui est 142929835591 en décimal.

Quoi qu'il en soit, PHP a déjà une constante que vous pouvez utiliser:

var_dump(PHP_INT_MAX + 1); // converted to float 
Questions connexes