integer - valid - strtotime w3schools
¿Por qué el valor máximo de un entero de n bits sin signo 2 ^ n-1 y no 2 ^ n? (12)
El valor máximo de un entero de n bits es 2 n -1. ¿Por qué tenemos el "menos 1"? ¿Por qué el máximo no es solo 2 n ?
¿Por qué tenemos el "menos 1"?
Solo responda la pregunta: ¿Cuál es el valor máximo de un entero de 1 bit ?
Un entero de un bit puede almacenar solo dos valores (2 1 ): 0 y 1 . El último valor es 1 2 = 1 10
El entero de dos bits puede almacenar solo cuatro (2 2 ) valores: 00 , 01 , 10 y 11 . El último valor es 11 2 = 3 10
Por lo tanto, cuando el entero puede almacenar N , el último valor de los valores será N-1 porque el conteo comienza desde cero .
n entero de n bits puede almacenar 2 n valores. Donde el último será 2 n -1
Ejemplo: un byte puede almacenar 2 8 (256) valores. Donde primero es 0 y último es 255
¿Por qué el máximo no es solo 2n?
Porque el conteo comienza desde cero. Mira el primer valor para cualquier entero de n bits.
Por ejemplo byte: 00000000
Esto sería muy confuso si:
00000001 significa 2
00000000 significa 1
no lo haria ;-)
2 32 en binario es uno seguido de 32 ceros, para un total de 33 bits. Eso no cabe en un valor int de 32 bits.
El -1 es porque los enteros comienzan en 0, pero nuestro conteo comienza en 1.
Por lo tanto, 2^32-1 es el valor máximo para un entero sin signo de 32 bits (32 dígitos binarios). 2^32 es el número de valores posibles .
Para simplificar por qué, mira decimal. 10^2-1 es el valor máximo de un número decimal de 2 dígitos (99). Debido a que nuestro conteo humano intuitivo comienza en 1, pero los enteros se basan en 0, 10^2 es el número de valores (100).
En el campo de la computación comenzamos a contar desde 0.
En la mayoría de los lenguajes de programación, 0 es un número también .
En la mayoría de los lenguajes de programación, entero es un valor con signo (ver el complemento de dos ).
Por ejemplo, en Java y .NET, el byte más a la izquierda está reservado para el signo:
-
0=> número positivo o cero -
1=> número negativo
Entonces el valor máximo para el número de 32-bit está limitado por 2^31 . Y sumando -1 obtenemos 2^31 - 1 .
¿Por qué aparece -1 ?
Mira un ejemplo más simple con un byte sin firmar (8 bits):
1 1 1 1 1 1 1 1
128 64 32 16 8 4 2 1 <-- the most right bit cannot represent 2
--- --------------------
128 + 127 = 255
Como otros individuos señalaron, el bit más correcto puede tener un valor máximo de 1 , no 2 , debido a los valores de 0/1 .
Int32.MaxValue = 2147483647 (.NET)
Es porque en computación, los números comienzan en 0 . Entonces, si tiene, por ejemplo, 32 líneas de dirección (2 32 bytes direccionables), estarán en el rango [0, 2^32) .
Los números de 0 a N no son N. Son N + 1. Esto no es obvio para la mayoría de las personas y, como resultado, muchos programas tienen errores porque si este es el motivo.
Porque 0 también está representado. La cantidad de números que puede representar es de hecho 2 ^ n con n bits, pero el número máximo es 2 ^ n-1 porque tiene que comenzar el conteo en 0, es decir, cada bit establecido en 0.
Para 1 bit: 0, 1
Para 2 bits: 0, 1, 2, 3
Para 3 bits: 0, 1, 2, 3, 4, 5, 6, 7
Y así.
Si le pregunto cuál es el valor más grande que puede incluir en un número de 2 dígitos, ¿diría que es 10 2 (100) o 10 2 -1 (99)? Obviamente lo último. De ello se deduce que si le pregunto cuál es el número de n dígitos más grande, sería 10 n -1. Pero ¿por qué existe el "-1"? Sencillamente, porque podemos representar 0 en un número de 2 dígitos también como 00 (pero todos escriben 0).
Vamos a reemplazar 10 con una base arbitraria, b . De ello se deduce que para una base dada, b , el mayor número de n dígitos que puede representar es b n -1. Usando un número de 32 bits ( n = 32 ) base-2 ( b = 2 ), vemos que el mayor valor que podemos representar es 2 32 -1.
Otra forma de pensar sobre esto es usar números más pequeños. Digamos que tenemos un número de 1 bit. ¿Me diría que el mayor valor que puede representar es 2 1 o 2 1 -1?
Si recién está comenzando con la programación, le sugiero que eche un vistazo a este artículo de wiki sobre representaciones de números firmados.
Como ha dicho Vicente, la razón por la que restas 1 es porque 0 también es un número incluido. Como ejemplo simple, con 3 bits, puede representar los siguientes enteros no negativos
0 : 000
1 : 001
2 : 010
3 : 011
4 : 100
5 : 101
6 : 110
7 : 111
Cualquier cosa más allá de eso requiere más de 3 dígitos. Por lo tanto, el número máximo que puede representar es 2 ^ 3-1 = 7. Por lo tanto, puede extender esto a cualquier n y decir que puede expresar números enteros en el rango [0,2^n -1] . Ahora puede leer ese artículo y entender las diferentes formas, y representar enteros negativos, etc.
2^32 en binario:
1 00000000 00000000 00000000 00000000
2^32 - 1 en binario:
11111111 11111111 11111111 11111111
Como puede ver, 2^32 toma 33 bits, mientras que 2^32 - 1 es el valor máximo de un entero de 32 bits.
La razón del error aparentemente "off-by-one" aquí es que el bit más bajo representa un uno, no un dos. Entonces el primer bit es en realidad 2^0 , el segundo bit es 2^1 , etc ...