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 ...