php - tiene - tipos de datos y su tamaño en bytes
Tamaño máximo INT para sistema de 32 bits (7)
2147483647 es el valor habitual 2 ^ 31-1. 1 bit para el signo y -1 porque también representamos 0.
del manual: "El tamaño de un entero depende de la plataforma, aunque un valor máximo de aproximadamente dos mil millones es el valor habitual (es decir, 32 bits firmados). Las plataformas de 64 bits generalmente tienen un valor máximo de aproximadamente 9E18. PHP no admite enteros sin signo. El tamaño entero se puede determinar usando la constante PHP_INT_SIZE, y el valor máximo usando la constante PHP_INT_MAX desde PHP 4.4.0 y PHP 5.0.5. "
Supongamos que estamos hablando de sistema de 32 bits.
PHP no admite INT sin signo. Significa que el valor INT debe estar entre -2,147,483,648 y 2,147,483,647 valores. E INT toma 4 bytes para almacenar un valor de 32 bits de longitud.
Entonces, ¿significa que tengo solo 31 bits para el valor y 1 bit para el signo? O puedo usar 32 bits enteros para almacenar un valor?
El complemento de dos se usa con mayor frecuencia para almacenar números, lo que significa que no se desperdicia 1 bit solo por el signo.
http://en.wikipedia.org/wiki/Two''s_complement
En PHP, si un número sobrepasa INT_MAX para una plataforma, lo convierte en un valor de coma flotante.
En primer lugar, si desea hacer cálculos con números enormes (por ejemplo, regular más de 10k), debe usar el módulo de precisión arbitraria bcmath .
En segundo lugar, la implementación oficial de php utiliza el complemento de Two internamente para representar números, como prácticamente todos los demás compiladores e intérpretes. Como la entropía del bit con signo (si cuentas 0 como positivo [1] ) es 1, y la entropía de 31 bits es, bueno, 31, puedes almacenar 2 32 = 4 294 967 296 valores distintos. Cómo los interpreta depende de su aplicación.
[1] - 0 no es ni positivo ni negativo.
Estás usando los 32 bits enteros. Es solo que las funciones de salida predeterminadas lo interpretan como un entero con signo. Si desea visualizar el valor "en bruto", use:
printf("%u", -1); // %u for unsigned
Sin embargo, como PHP maneja los enteros firmados internamente, solo puede usar bit arithmetics, pero no add / multiplication, etc. con ellos, si espera que se comporten como ints sin signo.
Normalmente, con enteros de 32 bits, la diferencia entre firmar y no firmar es exactamente la forma de interpretar el valor. Por ejemplo, (-1) +1 sería 1 para ambos, firmado y sin firmar, para firmar es obvio y para el que no está firmado, por supuesto, solo es cierto si solo se corta el desbordamiento. Entonces tienes 32 bits para almacenar valores, simplemente sucede que hay 1 bit que se interpreta de manera diferente del resto.
Por lo que sé en un sistema de 32 bits, el entero positivo más grande posible es 2147483647 Los valores anteriores serán valores flotantes, ya que un valor flotante en php puede tomar valores de hasta 10000000000000.
Sí, si hubiera usado un entero sin signo usará 32 bits para almacenarlo, ya que no necesita firmar en ese caso, pero como solo admite enteros con signo, un sistema de 32 bits tendrá 31 bits para el valor y 1 bit para el signo s0 máximo el rango entero con signo es -2147483648 a 2147483647.