w3schools valid hora con integer programming-languages numeric-limits

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