Java long Maximalwert: Long.MAX_VALUE, Bereich und Überlauf (mit Beispielen)

目次

1. Was ist der maximale Wert des Java‑long‑Typs?

Der maximale Wert des Java‑long‑Typs ist 9223372036854775807.
Er ist als Konstante Long.MAX_VALUE definiert.

Zuerst bestätigen wir das Ergebnis.

public class Main {
    public static void main(String[] args) {
        System.out.println(Long.MAX_VALUE);
    }
}

Ausgabe:

9223372036854775807

Mit anderen Worten, dies ist der größte positive Wert, den man in einem Java‑long speichern kann.

1.1 Der maximale long‑Wert ist „9223372036854775807“

Dieser Wert kann durch die folgende Formel ausgedrückt werden:

2^63 - 1

Der entscheidende Punkt ist, warum es „63“ ist.

  • Der long‑Typ ist ein 64‑Bit‑Integer.
  • 1 Bit wird für das Vorzeichen (positiv/negativ) verwendet.
  • Die verbleibenden 63 Bits repräsentieren den numerischen Wert.

Daher,

maximum value = 2^63 - 1

wird zum Maximum.

*Ein „Bit“ ist die kleinste Dateneinheit, die 0 oder 1 darstellt.

1.2 Warum ist es nicht 2^64 − 1, obwohl es 64‑Bit ist?

Dies ist der Punkt, der Anfänger am meisten verwirrt.

Javas long ist ein vorzeichenbehafteter Integer.
„Vorzeichenbehaftet“ bedeutet, dass er sowohl positive als auch negative Werte darstellen kann.

Aufschlüsselung der 64 Bits:

  • 1 Bit → Vorzeichen
  • 63 Bits → Wert

Damit ist der größte positive Wert:

2^63 - 1

Das ist der Grund.

„2^64 – 1“ gilt für einen vorzeichenlosen Integer.
Java hat keinen unsigned long‑Typ.

⚠ Häufiges Missverständnis

  • × Der maximale long‑Wert ist 18446744073709551615
  • ○ Korrekt: 9223372036854775807

1.3 Auch den minimalen long‑Wert prüfen

Der Minimalwert ist ein weiteres unverzichtbares Element, das zusammen mit dem Maximum auswendig gelernt werden sollte.

System.out.println(Long.MIN_VALUE);

Ausgabe:

-9223372036854775808

In Formelform:

-2^63

Der Betrag ist um 1 größer als das Maximum, weil Java Ganzzahlen mit Zweierkomplement verwaltet.

*Zweierkomplement ist der Standardmechanismus, den Computer verwenden, um negative Zahlen darzustellen.

Häufige Fallstricke und Hinweise

  • Verwechseln mit 2^64-1
  • Annahme, dass ein vorzeichenloser long existiert
  • Versuch, den Wert direkt auswendig zu lernen und dabei die Ziffern zu verwechseln
  • Verwechslung mit int (32‑Bit)

Insbesondere ist es sehr häufig, den Wert mit dem int‑Maximum (2147483647) zu verwechseln.

2. Wie man den maximalen long‑Wert in Java erhält

Beim Umgang mit dem maximalen Wert von long gilt die Regel: Schreibe die Zahl nicht direkt – verwende die Konstante.
Hier erklären wir sichere und praktische Methoden, um ihn zu erhalten.

2.1 Verwende Long.MAX_VALUE (empfohlen)

In Java ist der maximale Wert in der Klasse java.lang.Long definiert.

long max = Long.MAX_VALUE;
System.out.println(max);

Ausgabe:

9223372036854775807

Warum sollte man eine Konstante verwenden?

  • Verhindert Ziffern‑/Tippfehler
  • Verbessert die Lesbarkeit
  • Macht den Typ explizit
  • Ist robuster gegenüber zukünftigen Änderungen (Spezifikationsänderungen sind unwahrscheinlich, aber es ist sicherer)

Kein spezieller Import ist erforderlich.
Das Paket java.lang wird automatisch importiert.

2.2 Hinweise beim direkten Schreiben der Zahl

Man kann den maximalen Wert auch direkt schreiben.

long max = 9223372036854775807L;

Der wichtige Teil hier ist das nachgestellte „L“.

Warum ist „L“ erforderlich?

In Java wird ein Ganzzahl‑Literal (ein numerisches Literal) standardmäßig als int behandelt, wenn nichts angehängt wird.

Das bedeutet:

long max = 9223372036854775807;  // Error

Dies führt zu einem Kompilierfehler.

  • Es überschreitet den Bereich von int
  • Es gibt nicht explizit an, dass es ein long ist
    long max = 9223372036854775807L;
    

⚠ Ein kleingeschriebenes l ist schwer vom Zeichen 1 zu unterscheiden, daher wird ein großes L empfohlen.

2.3 Risiken des Hardcodings

„Hardcoding“ bedeutet, den numerischen Wert direkt zu schreiben.

if (value == 9223372036854775807L) {
    // Processing
}
  • Die Bedeutung ist unklar
  • Geringe Wartbarkeit
  • Schwer für andere Entwickler zu verstehen

Empfohlen:

if (value == Long.MAX_VALUE) {
    // Processing
}

Dies macht die Absicht des Codes klar.

Häufige Fehler

  • Vergessen, L hinzuzufügen, und einen Kompilierungsfehler erhalten
  • Versuchen, es einer int-Variablen zuzuweisen
  • Schreiben von Long max = Long.MAX_VALUE; und das mögliche Null-Handling nicht berücksichtigen (bei Verwendung von Wrapper-Klassen)
  • Versuchen, es mit Math.pow(2,63) zu berechnen (wird zu double und führt zu Präzisionsproblemen)

*Math.pow() gibt ein double zurück, daher ist es nicht geeignet für exakte Ganzzahlberechnungen.

3. Was passiert, wenn ein long den Maximalwert überschreitet? (Overflow)

Der long-Typ kann nur einen endlichen Bereich verarbeiten.
Wenn Sie also den Maximalwert überschreiten, wirft er keinen Fehler – sein Wert wrappt (zyklisch) zurück.
Dies wird „Overflow“ genannt.

3.1 Ein echtes Overflow-Beispiel

Lassen Sie es in der Praxis überprüfen.

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);
    }
}

Ausgabe:

Max value: 9223372036854775807
Max value + 1: -9223372036854775808

Sie können sehen, dass max + 1 zum Minimalwert wird.

Das ist nicht abnormal – das ist das Verhalten, das durch die Java-Spezifikation definiert ist.

3.2 Warum wird es nicht zu einem Fehler?

Java-Ganzzahltypen (int / long) werfen keine Ausnahmen, wenn der Wert den Bereich überschreitet.

Grund:

  • Feste Bitanzahl (long ist 64‑Bit)
  • Werte wrapen aufgrund der Zweierkomplement-Darstellung

Konzeptionell:

Max value → +1 → Min value
Min value → -1 → Max value

Der Computer berechnet einfach Bits, daher hat er kein Konzept von „außerhalb des Bereichs“.

⚠ Häufige Anfängerverwirrung

  • Annehmen, „es wird ein Fehler sein“
  • Das Vorzeichen wechselt plötzlich und wird zu einem Bug

3.3 Wie man Overflow erkennt

Sie können es nicht mit normaler Addition erkennen.

Methode 1: Verwenden Sie Math.addExact() (Empfohlen)

try {
    long result = Math.addExact(Long.MAX_VALUE, 1);
} catch (ArithmeticException e) {
    System.out.println("Overflow occurred");
}

Math.addExact() wirft eine ArithmeticException, wenn das Ergebnis den Bereich überschreitet.

Es gibt außerdem:

  • Math.subtractExact()
  • Math.multiplyExact()

ebenfalls.

3.4 Wie man eine Bereichsprüfung durchführt

Sie können auch vor dem Addieren prüfen.

if (value > Long.MAX_VALUE - addValue) {
    System.out.println("Adding will overflow");
}

*In der Praxis ist addExact() normalerweise sicherer als dieser Ansatz.

3.5 Verwenden Sie BigInteger (Keine Obergrenze)

Wenn long nicht ausreicht, verwenden Sie BigInteger.

import java.math.BigInteger;

BigInteger a = new BigInteger("9223372036854775807");
BigInteger b = BigInteger.ONE;
BigInteger result = a.add(b);

System.out.println(result);

BigInteger hat keine Ziffernbegrenzung.

Aber beachten Sie:

  • Langsamer als long
  • Verbraucht mehr Speicher
  • Kein primitiver Typ (es ist ein Objekttyp)

Häufige Fehler und Anmerkungen

  • Verwendung von long für Geldberechnungen und das Übersehen von Overflow
  • Generieren von IDs ohne Berücksichtigung von Obergrenzen
  • Verwendung von Math.pow und Einführen von Präzisionsfehlern
  • Konvertieren zu double und zurück (Verlust an Präzision)

Dies kann zu einem fatalen Bug werden, besonders in der Finanzverarbeitung.

4. Vergleich von Maximalwerten mit anderen Ganzzahltypen

Um den Maximalwert von long korrekt zu verstehen, sollten Sie auch darstellen, wie er sich von anderen Ganzzahltypen unterscheidet.
In Java hat jeder Ganzzahltyp einen klar definierten Bereich, basierend auf seiner Bitbreite.

4.1 Unterschied zu int

int ist ein 32‑Bit vorzeichenbehafteter Integer.

System.out.println(Integer.MAX_VALUE);

Ausgabe:

2147483647

Vergleich:

TypeBit widthMaximum value
int32-bit2,147,483,647
long64-bit9,223,372,036,854,775,807

Ein long kann einen Bereich verarbeiten, der etwa 4,3 Milliarden Mal größer ist als ein int.

⚠ Häufige Fehler

  • Annehmen, int sei ausreichend und später Overflow durch Wachstum verursachen
  • Zuordnen eines Datenbank‑BIGINT zu int

4.2 Vergleich mit short und byte

Lassen Sie uns auch kleinere Ganzzahltypen überprüfen.

System.out.println(Short.MAX_VALUE);  // 32767
System.out.println(Byte.MAX_VALUE);   // 127
TypeBit widthMaximum value
byte8-bit127
short16-bit32767
int32-bit2147483647
long64-bit9223372036854775807

Typische Anwendungsfälle:

  • byte → Anwendungsfälle für Datenkompression
  • short → kleinmaßstäbliche numerische Werte
  • int → typische Ganzzahlverarbeitung
  • long → große IDs und Zeitstempel

4.3 Wann sollten Sie long verwenden?

Typische Fälle, in denen Sie long verwenden:

  • UNIX-Zeitstempel (Millisekunden)
  • Datenbank-BIGINT-Spalten
  • Große sequenzielle IDs
  • Dateigrößen (Bytes)

Beispiel:

long timestamp = System.currentTimeMillis();

System.currentTimeMillis() gibt einen long zurück.
Dies liegt daran, dass Millisekundenwerte nicht in einen int passen.

4.4 Risiken bei unnötiger Verwendung von long

Ein long verwendet 8 Bytes.
Ein int verwendet 4 Bytes.

Beim Umgang mit großen Datenmengen:

  • Speichernutzung steigt
  • Cache-Effizienz nimmt ab
  • Leistungseinfluss (abhängig von der Umgebung)

Daher,

Wenn der Wertebereich eindeutig in einen int passt, verwenden Sie int.

ist das Grundprinzip.

Häufige Fehler und Hinweise

  • Die Datenbank ist BIGINT, aber Java verwendet int
  • Empfang von JSON‑Zahlenwerten als int, obwohl sie long annehmen
  • Präzisionsverlust durch implizite Casts bei Typumwandlungen
  • Direktes Zuweisen von Math.pow‑Ergebnissen zu long

Fehler aufgrund von Typinkompatibilitäten sind besonders häufig bei API-Integrationen.

5. Praktische Szenarien für den Umgang mit dem maximalen long-Wert

Der maximale Wert von long ist nicht nur theoretisches Wissen – er ist in der realen Entwicklung wichtig.
Sein Verständnis ist entscheidend, besonders in Prozessen, bei denen numerischer Überlauf fatal werden kann.

5.1 UNIX-Zeitstempel

Beim Abrufen der aktuellen Zeit in Java:

long now = System.currentTimeMillis();
System.out.println(now);

System.currentTimeMillis() gibt die Anzahl der Millisekunden seit dem 1. Januar 1970 zurück.

Wenn Sie es in einem int speichern:

int now = (int) System.currentTimeMillis();  // Dangerous

Der Wert ist beschädigt (nur die unteren 32 Bits bleiben erhalten).

⚠ Hinweise

  • Abschneiden durch Casten
  • Das Jahr‑2038‑Problem (Grenze von int‑basierten Zeitstempeln)
  • Verwechslung von Sekunden mit Millisekunden

Die Verwendung von long vermeidet das Jahr‑2038‑Problem.

5.2 Integration mit Datenbanken (BIGINT)

In vielen Datenbanken ist BIGINT ein 64‑Bit‑Integer.

Beispiel:

CREATE TABLE users (
    id BIGINT PRIMARY KEY
);

Auf der Java‑Seite:

long id;

Wenn Sie es als int erhalten:

  • Datenkorruption
  • Ausnahmen beim Erreichen der Obergrenze
  • Keine zukünftige Skalierbarkeit

⚠ Häufige reale Fehler

  • int ist zunächst ausreichend → später unzureichende Stellen
  • Falsche Typzuordnung im ORM
  • Probleme mit numerischer Präzision bei JSON‑Konvertierung (JavaScript ist nur bis 53 Bits sicher)

5.3 ID-Generierung und Obergrenzen

Verteilte IDs (z. B. Snowflake‑artige IDs) verwenden typischerweise long.

Beispiel:

long id = generateId();

Gründe:

  • 64‑Bit‑Raum ist ausreichend groß
  • Sequenz, Zeitstempel und Maschinen‑ID können in Bits aufgeteilt werden

Allerdings hat long theoretisch ebenfalls eine Obergrenze.

Beispielprüfung:

if (currentId == Long.MAX_VALUE) {
    throw new IllegalStateException("ID upper limit reached");
}

In der Praxis wird dies selten erreicht, aber es sollte im Systemdesign berücksichtigt werden.

5.4 Dateigrößenberechnungen

Ermitteln einer Dateigröße:

File file = new File("example.txt");
long size = file.length();

Für große Dateien ist int nicht ausreichend.

⚠ Hinweise

  • Konvertieren Sie long nicht zu int
  • Array‑Indizes sind int (hier treten die Beschränkungen auf)

Häufige reale Fehler

  • Präzisionsverlust in JavaScript beim Umgang mit long in JSON
  • Java‑Code nicht aktualisieren, wenn DB‑Spaltentypen geändert werden
  • Verwendung von long für Geldberechnungen und dadurch Überlauf verursachen
  • Entwurf persistenter IDs ohne Berücksichtigung von Obergrenzen

6. Häufige Missverständnisse über den maximalen long‑Wert

Der maximale Wert von long ist ein Thema mit vielen Missverständnissen in den Suchergebnissen.
Hier organisieren wir die verwirrendsten Punkte.

6.1 Es gibt kein unsigned long in Java

Das ist besonders verwirrend für Entwickler mit C/C++‑Erfahrung.

Java hat nicht:

an unsigned long type

Ein long ist immer ein 64‑Bit vorzeichenbehafteter Integer.

Daher ist der maximale positive Wert:

2^63 - 1

Das ist das Limit.

Seit Java 8 wurden die folgenden Methoden hinzugefügt:

Long.compareUnsigned(a, b);
Long.divideUnsigned(a, b);

Allerdings sind dies Hilfsmethoden für unsigned‑Operationen — es gibt immer noch keinen unsigned long‑Typ.

6.2 Der Maximalwert ist nicht 2^64 − 1

Fehlinformationen, die online häufig zu finden sind:

18446744073709551615

Dies ist der maximale Wert eines unsigned 64‑Bit‑Integers.

Da das long von Java vorzeichenbehaftet ist:

The maximum value is 9223372036854775807

Das ist der korrekte Wert.

Zusammenfassung des Unterschieds:

TypeMaximum value
Signed 64-bit2^63 – 1
Unsigned 64-bit2^64 – 1

Java verwendet das Erstere.

6.3 BigInteger und long sind unterschiedlich

BigInteger repräsentiert Ganzzahlen mit praktisch keiner Obergrenze.

Unterschied:

TypeUpper limitNature
longFixed 64-bitPrimitive type
BigIntegerVirtually unlimitedObject type

BigInteger:

  • Verbraucht mehr Speicher
  • Langsamere Berechnungen
  • Erfordert equals() zum Vergleich

long:

  • Schnell
  • Leichtgewichtig
  • Fester Wertebereich

Wählen Sie je nach Anwendungsfall.

6.4 Es ist gefährlich, das Maximum mit Math.pow zu berechnen

Falsches Beispiel:

long max = (long) Math.pow(2, 63) - 1;

Probleme:

  • Math.pow liefert einen double
  • double hat 53‑Bit‑Präzision
  • Präzisionsfehler treten bei großen Ganzzahlen auf

Korrekte Vorgehensweise:

long max = Long.MAX_VALUE;

Zusammenfassung häufiger Missverständnisse

  • Denken, dass unsigned long existiert
  • Verwechseln mit 2^64 – 1
  • Versuch, es mit Math.pow zu berechnen
  • Verlust der Präzision durch double‑Umwandlung
  • Verwechseln von BigInteger mit long

7. Zusammenfassung (Kurzüberblick)

Hier ist eine knappe Zusammenfassung der wichtigsten Punkte, die Sie in der Praxis benötigen.

7.1 Endgültige Antwort: Maximalwert von long

  • Maximalwert: 9223372036854775807
  • Konstante: Long.MAX_VALUE
  • Formel: 2^63 – 1
  • Typ: 64‑Bit vorzeichenbehafteter Integer

Verifizierungscode:

System.out.println(Long.MAX_VALUE);

7.2 Wesentliche Regeln, die Sie befolgen müssen

  • Kodieren Sie den numerischen Maximalwert nicht fest—verwenden Sie Long.MAX_VALUE
  • Fügen Sie L hinzu, wenn Sie ein long‑Literal schreiben
  • Verwechseln Sie es nicht mit int
  • Überlauf löst nicht automatisch eine Ausnahme aus

7.3 Wie man Überlauf verhindert

Um sicher zu addieren:

Math.addExact(a, b);

Falls der Wert das Limit überschreiten könnte:

  • Verwenden Sie BigInteger
  • Implementieren Sie Bereichsprüfungen

7.4 Wichtige Punkte in der Praxis

  • Empfangen Sie DB‑BIGINT‑Werte als long
  • Verwenden Sie long für UNIX‑Zeitstempel
  • Achten Sie auf Präzision bei JSON‑Integrationen
  • Berücksichtigen Sie Obergrenzen beim Entwurf von ID‑Systemen

7.5 Wichtigste Checkliste

  • Verwenden Sie versehentlich 2^64 – 1?
  • Gehen Sie davon aus, dass unsigned long existiert?
  • Berechnen Sie es mit Math.pow?
  • Casten Sie long zu int?
  • Verstehen Sie, was bei einem Überlauf passiert?

Der maximale Wert von long ist nicht nur etwas zum Auswendiglernen – er ist ein Kernkonzept, das Ihr Verständnis von Ganzzahltypen insgesamt beeinflusst.

FAQ

Q1. Was ist der maximale Wert von Javas long?

9223372036854775807.
Sie können ihn mit Long.MAX_VALUE abrufen.

Q2. Wie viele Bits hat ein long?

Es ist ein 64‑Bit vorzeichenbehafteter Integer.
1 Bit ist für das Vorzeichen, die restlichen 63 Bits repräsentieren den Wert.

Q3. Was passiert, wenn Sie Long.MAX_VALUE überschreiten?

Es tritt kein Fehler auf.
Es rollt auf den Minimalwert (-9223372036854775808) zurück.

System.out.println(Long.MAX_VALUE + 1);

Q4. Hat Java unsigned long?

Nein, nicht als Typ.
Java 8 und später bieten Hilfsmethoden für unsigned‑Operationen, aber der Typ selbst ist immer vorzeichenbehaftet.

Q5. Gibt es eine sichere Methode, den Maximalwert zu berechnen?

Berechnen Sie ihn nicht direkt. Verwenden Sie immer:

Long.MAX_VALUE

Math.pow() gibt einen double zurück und ist daher für große Ganzzahlen ungenau.

Q6. Sollte ich int oder long verwenden?

  • Wenn der Wertebereich etwa 2,1 Milliarden nicht überschreitet → int verwenden
  • Wenn er das überschreiten könnte → long verwenden

Verwende long für DB BIGINT‑Spalten und Zeitstempel.

Q7. Wie viele Stellen kann long verarbeiten?

Der Maximalwert hat 19 Stellen:
9223372036854775807

Q8. Was ist der Unterschied zwischen long und BigInteger?

  • long → festes 64‑Bit, schnell
  • BigInteger → praktisch unbegrenzt, langsamer

Wenn der Wertebereich in long passt, ist die Verwendung von long der Standardansatz.