- 1 1. ¿Cuál es el valor máximo del tipo long de Java?
- 2 2. Cómo obtener el valor máximo de long en Java
- 3 3. ¿Qué ocurre si un long supera el valor máximo? (Desbordamiento)
- 4 4. Comparando valores máximos con otros tipos enteros
- 5 5. Escenarios prácticos para manejar el valor máximo de long
- 6 6. Conceptos erróneos comunes sobre el valor máximo de long
- 7 7. Resumen (Repaso rápido)
- 8 Preguntas frecuentes
- 8.1 P1. ¿Cuál es el valor máximo del long de Java?
- 8.2 P2. ¿Cuántos bits tiene un long?
- 8.3 P3. ¿Qué ocurre si supera Long.MAX_VALUE?
- 8.4 P4. ¿Java tiene long sin signo?
- 8.5 P5. ¿Existe una forma segura de calcular el valor máximo?
- 8.6 Q6. ¿Debo usar int o long?
- 8.7 Q7. ¿Cuántos dígitos puede manejar long?
- 8.8 Q8. ¿Cuál es la diferencia entre long y BigInteger?
1. ¿Cuál es el valor máximo del tipo long de Java?
El valor máximo del tipo long de Java es 9223372036854775807.
Está definido como la constante Long.MAX_VALUE.
Primero, confirmemos la conclusión.
public class Main {
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE);
}
}
Salida:
9223372036854775807
En otras palabras, este es el valor positivo más grande que puedes almacenar en un long de Java.
1.1 El valor máximo de long es “9223372036854775807”
Este valor se puede expresar con la siguiente fórmula:
2^63 - 1
El punto clave es por qué es “63”.
- El tipo
longes un entero de 64 bits . - 1 bit se usa para el signo (positivo/negativo) .
- Los 63 bits restantes representan el valor numérico.
Por lo tanto,
maximum value = 2^63 - 1
se convierte en el máximo.
*Un “bit” es la unidad más pequeña de datos que representa 0 o 1.
1.2 ¿Por qué no es 2^64 − 1 a pesar de ser de 64 bits?
Este es el punto que más confunde a los principiantes.
El long de Java es un entero con signo.
“Con signo” significa que puede representar tanto valores positivos como negativos.
Desglose de los 64 bits:
- 1 bit → signo
- 63 bits → valor
Entonces, el valor positivo más grande es:
2^63 - 1
Por eso.
“2^64 – 1” se aplica a un entero sin signo.
Java no tiene un tipo unsigned long.
⚠ Malentendido común
- × El valor máximo de long es 18446744073709551615
- ○ Correcto: 9223372036854775807
1.3 También verifica el valor mínimo de long
El valor mínimo es otro elemento esencial que debes memorizar junto con el máximo.
System.out.println(Long.MIN_VALUE);
Salida:
-9223372036854775808
En forma de fórmula:
-2^63
El valor absoluto es 1 más grande que el máximo porque Java maneja los enteros usando complemento a dos.
*El complemento a dos es el mecanismo estándar que usan las computadoras para representar números negativos.
Errores comunes y notas
- Confundirlo con
2^64-1 - Asumir que existe un long sin signo
- Intentar memorizar el valor directamente y equivocarse en los dígitos
- Confundirlo con int (32 bits)
En particular, confundirlo con el valor máximo de int (2147483647) es extremadamente común.
2. Cómo obtener el valor máximo de long en Java
Al trabajar con el valor máximo de long, la regla es: no escribas el número directamente; usa la constante.
Aquí explicaremos formas seguras y prácticas de obtenerlo.
2.1 Usa Long.MAX_VALUE (recomendado)
En Java, el valor máximo está definido en la clase java.lang.Long.
long max = Long.MAX_VALUE;
System.out.println(max);
Salida:
9223372036854775807
¿Por qué debes usar una constante?
- Evita errores de dígitos o tipográficos
- Mejora la legibilidad
- Hace explícito el tipo
- Más robusto ante cambios futuros (los cambios en la especificación son improbables, pero es más seguro)
No se requiere una importación especial.
El paquete java.lang se importa automáticamente.
2.2 Notas al escribir el número directamente
También puedes escribir el valor máximo directamente.
long max = 9223372036854775807L;
La parte importante aquí es la “L” final.
¿Por qué se requiere “L”?
En Java, un literal entero (un literal numérico) se trata como un int por defecto si no se agrega nada.
Eso significa:
long max = 9223372036854775807; // Error
Esto causa un error en tiempo de compilación.
Razón:
- Excede el rango de int
- No indica explícitamente que es un long
Correcto:
long max = 9223372036854775807L;
⚠ Una l minúscula es difícil de distinguir del dígito 1, por lo que se recomienda L mayúscula.
2.3 Riesgos de codificar directamente
“Codificar directamente” significa escribir el valor numérico directamente.
Ejemplo:
if (value == 9223372036854775807L) {
// Processing
}
Problemas:
- El significado no es claro
- Baja mantenibilidad
- Difícil de entender para otros desarrolladores
Recomendado:
if (value == Long.MAX_VALUE) {
// Processing
}
Esto hace que la intención del código sea clara.
Errores comunes
- Olvidar añadir
Ly obtener un error de compilación - Intentar asignarlo a una variable
int - Escribir
Long max = Long.MAX_VALUE;y no considerar el posible manejo de null (cuando se usan clases wrapper) - Intentar calcularlo con
Math.pow(2,63)(se convierte en double e introduce problemas de precisión)
*Math.pow() devuelve un double, por lo que no es adecuado para cálculos exactos de enteros.
3. ¿Qué ocurre si un long supera el valor máximo? (Desbordamiento)
El tipo long solo puede manejar un rango finito.
Así que si superas el valor máximo, no lanza un error—su valor se envuelve (cicla).
Esto se llama “desbordamiento.”
3.1 Un ejemplo real de desbordamiento
Verifiquémoslo en la práctica.
public class Main {
public static void main(String[] args) {
long max = Long.MAX_VALUE;
long overflow = max + 1;
System.out.println("Max value: " + max);
System.out.println("Max value + 1: " + overflow);
}
}
Salida:
Max value: 9223372036854775807
Max value + 1: -9223372036854775808
Puedes ver que max + 1 se convierte en el valor mínimo.
Esto no es anormal—es el comportamiento definido por la especificación de Java.
3.2 ¿Por qué no se convierte en un error?
Los tipos enteros de Java (int / long) no lanzan excepciones cuando el valor supera el rango.
Razón:
- Número fijo de bits (long tiene 64 bits)
- Los valores se envuelven debido a la representación en complemento a dos
Conceptualmente:
Max value → +1 → Min value
Min value → -1 → Max value
La computadora simplemente calcula bits, por lo que no tiene el concepto de “fuera de rango.”
⚠ Confusión común de principiantes
- Asumir que “será un error”
- El signo cambia repentinamente y se convierte en un error
3.3 Cómo detectar el desbordamiento
No puedes detectarlo con una suma normal.
Método 1: Usar Math.addExact() (Recomendado)
try {
long result = Math.addExact(Long.MAX_VALUE, 1);
} catch (ArithmeticException e) {
System.out.println("Overflow occurred");
}
Math.addExact() lanza una ArithmeticException cuando el resultado supera el rango.
También existen:
Math.subtractExact()Math.multiplyExact()
también.
3.4 Cómo hacer una verificación de rango
También puedes verificar antes de sumar.
if (value > Long.MAX_VALUE - addValue) {
System.out.println("Adding will overflow");
}
*En la práctica, addExact() suele ser más seguro que este enfoque.
3.5 Usar BigInteger (Sin límite superior)
Si long no es suficiente, usa BigInteger.
import java.math.BigInteger;
BigInteger a = new BigInteger("9223372036854775807");
BigInteger b = BigInteger.ONE;
BigInteger result = a.add(b);
System.out.println(result);
BigInteger no tiene límite de dígitos.
Pero ten en cuenta:
- Más lento que long
- Consume más memoria
- No es un tipo primitivo (es un tipo de objeto)
Errores comunes y notas
- Usar long para cálculos monetarios y no notar el desbordamiento
- Generar IDs sin considerar límites superiores
- Usar Math.pow e introducir errores de precisión
- Convertir a double y volver (pérdida de precisión)
Esto puede convertirse en un error fatal, especialmente en el procesamiento financiero.
4. Comparando valores máximos con otros tipos enteros
Para entender correctamente el valor máximo de long, también debes organizar cómo difiere de otros tipos enteros.
En Java, cada tipo entero tiene un rango claramente definido basado en su ancho de bits.
4.1 Diferencia con int
int es un entero con signo de 32 bits.
System.out.println(Integer.MAX_VALUE);
Salida:
2147483647
Comparación:
| Type | Bit width | Maximum value |
|---|---|---|
| int | 32-bit | 2,147,483,647 |
| long | 64-bit | 9,223,372,036,854,775,807 |
Un long puede manejar un rango aproximadamente 4.300.000.000 veces mayor que un int.
⚠ Errores comunes
- Asumir que int es suficiente y luego causar desbordamiento por crecimiento
- Mapear un BIGINT de base de datos a int
4.2 Comparación con short y byte
También revisemos tipos enteros más pequeños.
System.out.println(Short.MAX_VALUE); // 32767
System.out.println(Byte.MAX_VALUE); // 127
| Type | Bit width | Maximum value |
|---|---|---|
| byte | 8-bit | 127 |
| short | 16-bit | 32767 |
| int | 32-bit | 2147483647 |
| long | 64-bit | 9223372036854775807 |
Casos de uso típicos:
- byte → casos de uso de compresión de datos
- short → valores numéricos de pequeña escala
- int → procesamiento típico de enteros
- long → IDs grandes y marcas de tiempo
4.3 ¿Cuándo deberías usar long?
Casos típicos donde usas long:
- Marcas de tiempo UNIX (milisegundos)
- Columnas BIGINT en bases de datos
- IDs secuenciales grandes
- Tamaños de archivo (bytes)
Ejemplo:
long timestamp = System.currentTimeMillis();
System.currentTimeMillis() devuelve un long.
Esto se debe a que los valores a nivel de milisegundos no caben en un int.
4.4 Riesgos de usar long innecesariamente
Un long usa 8 bytes.
Un int usa 4 bytes.
Al manejar grandes cantidades de datos:
- El uso de memoria aumenta
- La eficiencia de la caché disminuye
- Impacto en el rendimiento (depende del entorno)
Por lo tanto,
Si el rango claramente cabe en un int, usa int.
es el principio básico.
Errores comunes y notas
- La base de datos es BIGINT pero Java usa int
- Recibir valores numéricos JSON como int aunque se asumen como long
- Pérdida de precisión debido a conversiones implícitas durante la conversión de tipos
- Asignar resultados de Math.pow directamente a long
Los errores por incompatibilidades de tipo son especialmente comunes en integraciones de API.
5. Escenarios prácticos para manejar el valor máximo de long
El valor máximo de long no es solo un conocimiento teórico; es importante en el desarrollo del mundo real. Comprenderlo es esencial, especialmente en procesos donde el desbordamiento numérico puede ser fatal.
5.1 Marcas de tiempo UNIX
Al obtener la hora actual en Java:
long now = System.currentTimeMillis();
System.out.println(now);
System.currentTimeMillis() devuelve el número de milisegundos transcurridos desde el 1 de enero de 1970.
Si lo almacenas en un int:
int now = (int) System.currentTimeMillis(); // Dangerous
El valor se corrompe (solo se conservan los 32 bits inferiores).
⚠ Notas
- Truncamiento por casting
- El problema del año 2038 (límite de marcas de tiempo basadas en int)
- Confundir segundos con milisegundos
Usar long evita el problema del año 2038.

5.2 Integración con bases de datos (BIGINT)
En muchas bases de datos, BIGINT es un entero de 64 bits.
Ejemplo:
CREATE TABLE users (
id BIGINT PRIMARY KEY
);
En el lado de Java:
long id;
Si lo recibes como un int:
- Corrupción de datos
- Excepciones al alcanzar el límite superior
- Sin escalabilidad futura
⚠ Errores comunes en el mundo real
- int es suficiente al principio → dígitos insuficientes después
- Mapeo de tipo incorrecto en ORM
- Problemas de precisión numérica durante la conversión JSON (JavaScript es seguro solo hasta 53 bits)
5.3 Generación de IDs y límites superiores
Los IDs distribuidos (p. ej., IDs estilo Snowflake) típicamente usan long.
Ejemplo:
long id = generateId();
Razones:
- El espacio de 64 bits es suficientemente grande
- La secuencia, la marca de tiempo y el ID de máquina pueden dividirse en bits
Sin embargo, teóricamente, long también tiene un límite superior.
Ejemplo de verificación:
if (currentId == Long.MAX_VALUE) {
throw new IllegalStateException("ID upper limit reached");
}
En la práctica, esto rara vez se alcanza, pero debe considerarse en el diseño del sistema.
5.4 Cálculos de tamaño de archivo
Obtener el tamaño de un archivo:
File file = new File("example.txt");
long size = file.length();
Para archivos grandes, int no es suficiente.
⚠ Notas
- No conviertas long a int
- Los índices de arreglos son int (aquí es donde ocurren las limitaciones)
Errores comunes en el mundo real
- Pérdida de precisión en JavaScript al manejar long en JSON
- No actualizar el código Java al cambiar los tipos de columnas en la base de datos
- Usar long para cálculos monetarios y causar desbordamiento
- Diseñar IDs persistentes sin considerar los límites superiores
6. Conceptos erróneos comunes sobre el valor máximo de long
El valor máximo de long es un tema con muchos malentendidos en los resultados de búsqueda.
Aquí organizamos los puntos más confusos.
6.1 No existe long sin signo en Java
Esto es especialmente confuso para desarrolladores con experiencia en C/C++.
Java no tiene:
an unsigned long type
Un long es siempre un entero con signo de 64 bits.
Por lo tanto, el valor positivo máximo es:
2^63 - 1
Ese es el límite.
Desde Java 8, se añadieron los siguientes métodos:
Long.compareUnsigned(a, b);
Long.divideUnsigned(a, b);
Sin embargo, estos son métodos auxiliares para operaciones sin signo—todavía no existe un tipo long sin signo.
6.2 El valor máximo no es 2^64 − 1
Desinformación que se encuentra a menudo en línea:
18446744073709551615
Este es el valor máximo de un entero sin signo de 64 bits.
Dado que el long de Java es con signo:
The maximum value is 9223372036854775807
Ese es el valor correcto.
Resumen de la diferencia:
| Type | Maximum value |
|---|---|
| Signed 64-bit | 2^63 – 1 |
| Unsigned 64-bit | 2^64 – 1 |
Java usa el primero.
6.3 BigInteger y long son diferentes
BigInteger representa enteros con prácticamente sin límite superior.
Diferencia:
| Type | Upper limit | Nature |
|---|---|---|
| long | Fixed 64-bit | Primitive type |
| BigInteger | Virtually unlimited | Object type |
BigInteger:
- Usa más memoria
- Cálculos más lentos
- Requiere equals() para la comparación
long:
- Rápido
- Ligero
- Rango fijo
Elija según su caso de uso.
6.4 Es peligroso calcular el máximo con Math.pow
Ejemplo incorrecto:
long max = (long) Math.pow(2, 63) - 1;
Problemas:
- Math.pow devuelve un double
- double tiene precisión de 53 bits
- Se producen errores de precisión para enteros grandes
Enfoque correcto:
long max = Long.MAX_VALUE;
Resumen de confusiones comunes
- Pensar que existe long sin signo
- Confundirlo con 2^64 – 1
- Intentar calcularlo con Math.pow
- Perder precisión mediante la conversión a double
- Confundir BigInteger con long
7. Resumen (Repaso rápido)
Aquí hay un resumen conciso de los puntos clave que necesita en la práctica.
7.1 Respuesta final: valor máximo de long
- Valor máximo: 9223372036854775807
- Constante: Long.MAX_VALUE
- Fórmula: 2^63 – 1
- Tipo: entero con signo de 64 bits
Código de verificación:
System.out.println(Long.MAX_VALUE);
7.2 Reglas esenciales que debe seguir
- No codifique el valor máximo numérico directamente—use
Long.MAX_VALUE - Añada
Lal escribir un literal long - No lo confunda con int
- El desbordamiento no lanza una excepción automáticamente
7.3 Cómo prevenir el desbordamiento
Para sumar de forma segura:
Math.addExact(a, b);
Si el valor puede superar el límite:
- Use BigInteger
- Implemente verificaciones de rango
7.4 Puntos importantes en la práctica
- Reciba valores BIGINT de la base de datos como long
- Use long para marcas de tiempo UNIX
- Tenga cuidado con la precisión en integraciones JSON
- Considere los límites superiores al diseñar sistemas de ID
7.5 Lista de verificación más importante
- ¿Está usando erróneamente 2^64 – 1?
- ¿Asume que existe long sin signo?
- ¿Lo está calculando con Math.pow?
- ¿Está convirtiendo long a int?
- ¿Entiende qué ocurre con el desbordamiento?
El valor máximo de long no es solo algo que memorizar—es un concepto central que afecta su comprensión de los tipos enteros en su conjunto.
Preguntas frecuentes
P1. ¿Cuál es el valor máximo del long de Java?
9223372036854775807.
Puede obtenerlo con Long.MAX_VALUE.
P2. ¿Cuántos bits tiene un long?
Es un entero con signo de 64 bits.
1 bit es para el signo, y los 63 bits restantes representan el valor.
P3. ¿Qué ocurre si supera Long.MAX_VALUE?
No ocurre error.
Se desborda y pasa al valor mínimo (-9223372036854775808).
System.out.println(Long.MAX_VALUE + 1);
P4. ¿Java tiene long sin signo?
No, no como tipo.
Java 8 y posteriores proporcionan métodos auxiliares para operaciones sin signo, pero el tipo siempre es con signo.
P5. ¿Existe una forma segura de calcular el valor máximo?
No lo calcule directamente. Siempre use:
Long.MAX_VALUE
Math.pow() devuelve un double y por lo tanto es impreciso para enteros grandes.
Q6. ¿Debo usar int o long?
- Si el rango está dentro de aproximadamente 2.1 mil millones → usar int
- Si puede exceder eso → usar long
Usa long para columnas BIGINT en bases de datos y marcas de tiempo.
Q7. ¿Cuántos dígitos puede manejar long?
El valor máximo tiene 19 dígitos:
9223372036854775807
Q8. ¿Cuál es la diferencia entre long y BigInteger?
- long → 64 bits fijos, rápido
- BigInteger → prácticamente ilimitado, más lento
Si el rango cabe dentro de long, usar long es el enfoque estándar.

