Java Academy · Les

Gehele getallen: rekenkunde en overflow

Begrijp gehele getallen delen, modulus, overflowgedrag en hoe u dit detecteert.

Les 2 van 413 stappen

Gehele getallen: rekenkunde en overflow is een gratis Java Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Rekenen met gehele getallen en overloop

Gehele getallen in Java hebben een vaste grootte. Wanneer een berekening de maximale of minimale waarde overschrijdt, slaat het resultaat stil om — er wordt geen uitzondering gegooid. Als je dit begrijpt, voorkom je subtiele fouten.

Bereiken van gehele getallen

Elk type voor gehele getallen heeft een begrensd bereik dat wordt bepaald door de bitbreedte:

  • byte: -128 tot 127
  • short: -32,768 tot 32,767
  • int: -2,147,483,648 tot 2,147,483,647
  • long: -9.2 × 10^18 tot 9.2 × 10^18
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648
System.out.println(Long.MAX_VALUE);    // 9223372036854775807
System.out.println(Byte.MAX_VALUE);    // 127

Overloop: stille omslag

1 optellen bij Integer.MAX_VALUE laat de waarde omslaan naar Integer.MIN_VALUE. Dit is tweecomplementrekenkunde — Java geeft geen garantie en gooit geen uitzondering.

int max = Integer.MAX_VALUE;
System.out.println(max + 1); // -2147483648 (overflow!)

byte b = 127;
b++;  // wraps to -128
System.out.println(b); // -128

// Real bug: counting votes in a large election with int
int votes = Integer.MAX_VALUE;
votes += 100; // silently wrong
System.out.println(votes); // negative number!

Overloop detecteren met Math.addExact

Java 8+ introduceerde Math.addExact(), multiplyExact() en subtractExact(). Deze methoden gooien bij overloop een ArithmeticException in plaats van stil om te slaan.

try {
    int result = Math.addExact(Integer.MAX_VALUE, 1);
} catch (ArithmeticException e) {
    System.out.println("Overflow detected!"); // prints this
}

try {
    long safe = Math.multiplyExact(100_000L, 100_000L);
    System.out.println(safe); // 10000000000
} catch (ArithmeticException e) {
    System.out.println("Multiply overflow");
}

Gehele deling en modulo

Gehele deling kapt af richting nul. De operator % geeft de rest met het teken van het deeltal. Let op delen door nul — dit gooit ArithmeticException.

System.out.println(10 / 3);    // 3 (not 3.33)
System.out.println(10 % 3);    // 1
System.out.println(-10 % 3);   // -1 (sign follows dividend)
System.out.println(-10 % -3);  // -1

try {
    int x = 5 / 0; // ArithmeticException: / by zero
} catch (ArithmeticException e) {
    System.out.println(e.getMessage()); // / by zero
}

// Float division by zero gives Infinity, not exception
System.out.println(5.0 / 0); // Infinity

Rekenen met long voor grote getallen

Gebruik long wanneer waarden het bereik van int kunnen overschrijden. Voeg altijd L toe aan long-literalen om overloop vóór de toewijzing te voorkomen.

// Bug: multiplication done as int, then widened
long wrong = 1_000_000 * 1_000_000;   // overflows int!
System.out.println(wrong); // -727379968 (wrong!)

// Fix: one operand is long
long correct = 1_000_000L * 1_000_000L;
System.out.println(correct); // 1000000000000

// Or cast first
long alsOk = (long) 1_000_000 * 1_000_000;
System.out.println(alsOk); // 1000000000000

Bitverschuivingsoperatoren

Bitverschuivingsoperatoren zijn snelle manieren om te vermenigvuldigen of te delen door machten van 2:

  • n << k — naar links verschuiven: vermenigvuldigen met 2^k
  • n >> k — rechts verschuiven met teken: delen door 2^k
  • n >>> k — ongetekend naar rechts verschuiven: aanvullen met nullen
int n = 8;
System.out.println(n << 1);  // 16 (8 * 2)
System.out.println(n << 2);  // 32 (8 * 4)
System.out.println(n >> 1);  // 4  (8 / 2)
System.out.println(n >> 2);  // 2  (8 / 4)

// Check if number is power of 2
boolean isPow2 = n > 0 && (n & (n - 1)) == 0;
System.out.println(isPow2); // true

Bitsgewijze AND, OR en XOR

Bitsgewijze operatoren werken op afzonderlijke bits en worden gebruikt voor machtigingen, vlaggen en laag-niveauprotocollen.

int a = 0b1010; // 10
int b = 0b1100; // 12

System.out.println(Integer.toBinaryString(a & b)); // 1000 (AND = 8)
System.out.println(Integer.toBinaryString(a | b)); // 1110 (OR  = 14)
System.out.println(Integer.toBinaryString(a ^ b)); // 0110 (XOR = 6)
System.out.println(Integer.toBinaryString(~a));    // ...11110101 (NOT)

// Permission flags example
int READ  = 0b001;
int WRITE = 0b010;
int EXEC  = 0b100;
int perms = READ | WRITE; // user has read+write
System.out.println((perms & EXEC) != 0); // false — no exec

Onderstrepingstekens in numerieke literalen

Java 7+ staat onderstrepingstekens in numerieke literalen toe om de leesbaarheid te verbeteren. De compiler negeert ze.

int million = 1_000_000;
long creditCard = 4_111_1111_1111_1111L;
double pi = 3.141_592_653_589_793;
int hex = 0xFF_EC_D1_2E;
int binary = 0b0001_0101_0110;

System.out.println(million);   // 1000000
System.out.println(creditCard); // 4111111111111111

BigInteger voor willekeurige precisie

Wanneer waarden buiten long vallen, gebruik je BigInteger. Dit type kent geen overloop, maar is trager dan primitieve typen. Gebruik het voor cryptografische sleutels, faculteiten en astronomische getallen.

import java.math.BigInteger;

BigInteger factorial100 = BigInteger.ONE;
for (int i = 2; i <= 100; i++) {
    factorial100 = factorial100.multiply(BigInteger.valueOf(i));
}
System.out.println(factorial100.toString().length() + " digits"); // 158 digits

BigInteger a = new BigInteger("999999999999999999999999999999");
BigInteger b = new BigInteger("1");
System.out.println(a.add(b)); // 1000000000000000000000000000000

Praktisch: teller die veilig is voor overloop

Een patroon voor het implementeren van een teller die veilig met overloop omgaat door Math.addExact te gebruiken en terug te vallen op Long.MAX_VALUE.

class SafeCounter {
    private long count = 0;

    public void increment() {
        try {
            count = Math.addExact(count, 1L);
        } catch (ArithmeticException e) {
            count = Long.MAX_VALUE; // cap at max
        }
    }

    public long get() { return count; }
}

SafeCounter sc = new SafeCounter();
sc.increment();
sc.increment();
System.out.println(sc.get()); // 2

Korte controle

Wat is de waarde van de volgende expressie?

long result = 1_000_000 * 1_000_000;
System.out.println(result);

Samenvatting: gehelegetallenberekeningen en overloop

Belangrijkste punten:

  • Overloop bij gehele getallen slaat stilletjes om — standaard wordt er geen uitzondering gegenereerd
  • Gebruik Math.addExact/multiplyExact/subtractExact om overloop op te vangen
  • Gehelegetallendeling wordt afgekapt in de richting van nul; het teken van % volgt de deeltal
  • Gebruik letterlijke waarden van het type long (achtervoegsel L) wanneer tussenresultaten buiten het bereik van int kunnen vallen
  • BigInteger verwerkt waarden van willekeurige grootte zonder overloop
  • Bitverschuivingsoperatoren zijn snelle alternatieven voor vermenigvuldigen of delen door machten van 2
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Gehele getallen: rekenkunde en overflow” gratis?

Ja — de volledige tekst van “Gehele getallen: rekenkunde en overflow” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Gehele getallen: rekenkunde en overflow”?

Begrijp gehele getallen delen, modulus, overflowgedrag en hoe u dit detecteert. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Gehele getallen: rekenkunde en overflow”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. De basis van de klasse Math
  2. Gehele getallen: rekenkunde en overflow
  3. BigDecimal voor financiële berekeningen
  4. NumberFormat en printf
← Terug naar Java Academy