<?php
/*
* La lección de este ejemplo es el resultado
* más que el código de PHP en sí.
*/
$magnitude_lower = pow(2, (PHP_INT_SIZE * 8) - 2);
p($magnitude_lower - 1);
p($magnitude_lower, '¿Ve el incremento? Obsérvelo la próxima vez...');
p(PHP_INT_MAX, 'PHP_INT_MAX');
p(~PHP_INT_MAX, 'interpretado como uno más que PHP_INT_MAX');
if (PHP_INT_SIZE == 4) {
$nota = 'interpretado como el mayor entero sin signo';
} else {
$nota = 'interpretado como el mayor entero sin signo
(18446744073709551615) aunque sesgado por la precisión del float';
}
p(-1, $nota);
function p($entrada, $nota = '') {
echo "entrada: $entrada\n";
$formato = '%0' . (PHP_INT_SIZE * 8) . 'b';
$bin = sprintf($formato, $entrada);
echo "binario: $bin\n";
ini_set('precision', 20); // Para la legibilidad en bloques de 64 bits.
$dec = bindec($bin);
echo 'bindec(): ' . $dec . "\n";
if ($nota) {
echo "NOTA: $nota\n";
}
echo "\n";
}
?>
El resultado del ejemplo en equipos de 32 bit sería:
entrada: 1073741823
binario: 00111111111111111111111111111111
bindec(): 1073741823
entrada: 1073741824
binario: 01000000000000000000000000000000
bindec(): 1073741824
NOTA: ¿Ve el incremento? Obsérvelo la próxima vez...
entrada: 2147483647
binario: 01111111111111111111111111111111
bindec(): 2147483647
NOTA: PHP_INT_MAX
entrada: -2147483648
binario: 10000000000000000000000000000000
bindec(): 2147483648
NOTA: interpretado como uno más que PHP_INT_MAX
entrada: -1
binario: 11111111111111111111111111111111
bindec(): 4294967295
NOTA: interpretado como el mayor entero sin signo
El resultado del ejemplo en equipos de 64 bit sería:
entrada: 4611686018427387903
binario: 0011111111111111111111111111111111111111111111111111111111111111
bindec(): 4611686018427387903
entrada: 4611686018427387904
binario: 0100000000000000000000000000000000000000000000000000000000000000
bindec(): 4611686018427387904
NOTA: ¿Ve el incremento? Obsérvelo la próxima vez...
entrada: 9223372036854775807
binario: 0111111111111111111111111111111111111111111111111111111111111111
bindec(): 9223372036854775807
NOTA: PHP_INT_MAX
entrada: -9223372036854775808
binario: 1000000000000000000000000000000000000000000000000000000000000000
bindec(): 9223372036854775808
NOTA: interpretado como uno más que PHP_INT_MAX
entrada: -1
binario: 1111111111111111111111111111111111111111111111111111111111111111
bindec(): 18446744073709551616
NOTA: interpretado como el mayor entero sin signo
(18446744073709551615) aunque sesgado por la precisión del float