andi@abow: ~/ausbildung_fachinformatiker/ $ cat fisi-zweierkomplement-2k-wertebereiche-rechnen-wie-ein-computer-teil-2.md
>_abow

how do you do IT

Alle möglichen Handkniffe, die ich mir so zusammentrage im Berufsalltag

← cd ~/

FISI // Zweierkomplement (2K): Wertebereiche & Rechnen wie ein Computer (Teil 2)

FISI // Zweierkomplement (2K): Wertebereiche & Rechnen wie ein Computer (Teil 2)

In Teil 1 haben wir gelernt, wie negative Zahlen im Zweierkomplement (2K) dargestellt und umgerechnet werden. Jetzt kommt der spannende Teil: Wie viele Zahlen passen eigentlich in n Bit – und wie rechnet eine CPU damit, obwohl sie eigentlich nur addieren kann?

📚 Diese Reihe: Teil 1 – Darstellen & Umrechnen · Teil 2 – Wertebereiche & Rechnen wie ein Computer (dieser Beitrag)

Wertebereiche: Was passt in n Bit?

Mit n Bits lassen sich immer genau 2ⁿ verschiedene Zahlen darstellen. Wie viele das sind, ändert sich also nicht – nur welche Zahlen, je nach Interpretation:

DarstellungWertebereich (WB)Beispiel n = 3 BitBeispiel n = 8 Bit
„normales“ Binär (nur ⊕, ℕ₀)[0 ; 2ⁿ−1][0 ; 7][0 ; 255]
Zweierkomplement (⊕ & ⊖, ℤ)[−2ⁿ⁻¹ ; 2ⁿ⁻¹−1][−4 ; 3][−128 ; 127]

Bei 3 Bit sind es in beiden Fällen 8 darstellbare Zahlen – einmal 0…7, einmal −4…3. Beim Zweierkomplement „kostet“ das VZ-Bit die Hälfte des positiven Bereichs, dafür gibt’s negative Zahlen. Der negative Bereich reicht eine Zahl weiter als der positive (−4 vs. +3), weil die 0 keinen eigenen Vorzeichen-Slot braucht.

Merksatz: Normal [0 ; 2ⁿ−1], Zweierkomplement [−2ⁿ⁻¹ ; 2ⁿ⁻¹−1].

Rechnen wie ein Computer: Subtraktion = Addition

Hier wird’s spannend: Eine CPU kann eigentlich gar nicht subtrahieren. Sie kann nur addieren. Der Trick: Statt a − b rechnet sie a + (−b), wobei −b im Zweierkomplement vorliegt. Ein eventueller Übertrag aus dem höchsten Bit wird einfach verworfen – und das Ergebnis stimmt automatisch.

Genau deshalb ist 2K im Computer so beliebt: Addition und Subtraktion laufen über dieselbe Hardware-Schaltung.

Beispiel a) 7 + (−5) = 2 (4 Bit)

OperandBits
70111
−51011₂ₖ
Summe(1)0010 → Übertrag streichen → 0010 = 2

Beispiel b) 13 − 8 = 5 (5 Bit) → gerechnet als 13 + (−8)

OperandBits
1301101
−811000₂ₖ
Summe(1)0010100101 = 5

Beispiel c) 23 − 16 = 7 (6 Bit) → 23 + (−16)

OperandBits
23010111
−16110000₂ₖ
Summe(1)000111000111 = 7

Beispiel d) −3 + (−5) = −8 (4 Bit) – zwei negative Zahlen

OperandBits
−31101₂ₖ
−51011₂ₖ
Summe(1)10001000₂ₖ = −8

In allen Fällen: addieren, den Übertrag links wegwerfen, fertig. Kein Sonderfall fürs Minus.

⚠️ Überlauf (Overflow) – wenn das Ergebnis nicht mehr passt

Was passiert, wenn das Ergebnis den Wertebereich sprengt? Beispiel in 3 Bit (WB [−4 ; 3]):

−4 + (−4) = −8 — aber −8 liegt außerhalb von [−4 ; 3].

OperandBits
−4100₂ₖ
−4100₂ₖ
Summe(1)000000 = 0 ❌ (erwartet: −8)

Das Ergebnis 0 ist schlicht falsch – ein klassischer Integer Overflow. Die Faustregel zur Erkennung:

Haben beide Summanden dasselbe Vorzeichen, das Ergebnis aber ein anderes, ist ein Überlauf passiert.

Hier: beide Operanden negativ (MSB 1), Ergebnis positiv (MSB 0) → Overflow. Genau solche Fehler stecken hinter realen Bugs (vom „Gangnam-Style-Zähler“ bei YouTube bis zu sicherheitskritischen int-Overflows). Wer den Wertebereich im Kopf hat, sieht sie kommen.

💻 Zum Selbst-Ausprobieren: PowerShell-Demo

Dieses Skript berechnet Wertebereiche und addiert zwei Zahlen wie eine CPU – inklusive automatischer Overflow-Erkennung:

<#
.SYNOPSIS
    Demonstriert Wertebereiche und Addition im Zweierkomplement (wie eine CPU).
.DESCRIPTION
    Funktionen:
      ConvertTo-TwosComplement   -> Dezimalzahl in 2K-Bitstring (feste Bitbreite)
      Get-TwosComplementRange    -> Wertebereich fuer n Bit
      Add-TwosComplement         -> Addition zweier Zahlen mit Overflow-Erkennung
.NOTES
    Name: PS_Zweierkomplement_Arithmetik
    Author: Andreas Bowitz
    Version: 0.1
    LastUpdated: 2026-Jun-02
#>

function ConvertTo-TwosComplement {
    param(
        [Parameter(Mandatory)][int]$Value,
        [int]$Bits = 8
    )
    $mask = [int]([math]::Pow(2, $Bits) - 1)
    $tc   = $Value -band $mask
    return [Convert]::ToString($tc, 2).PadLeft($Bits, '0')
}

function Get-TwosComplementRange {
    param([int]$Bits = 8)
    [PSCustomObject]@{
        Bits  = $Bits
        Min   = -[int][math]::Pow(2, $Bits - 1)
        Max   =  [int][math]::Pow(2, $Bits - 1) - 1
        Count = [int][math]::Pow(2, $Bits)
    }
}

function Add-TwosComplement {
    param(
        [Parameter(Mandatory)][int]$A,
        [Parameter(Mandatory)][int]$B,
        [int]$Bits = 4
    )
    $range = Get-TwosComplementRange -Bits $Bits
    $sum   = $A + $B
    # Overflow: Ergebnis liegt ausserhalb des Wertebereichs
    $overflow = ($sum -lt $range.Min) -or ($sum -gt $range.Max)
    [PSCustomObject]@{
        Rechnung = "$A + ($B)"
        Bits     = "$(ConvertTo-TwosComplement $A $Bits) + $(ConvertTo-TwosComplement $B $Bits)"
        Ergebnis = $sum
        Overflow = $overflow
    }
}

# --- Test anhand der Beispiele aus dem Artikel ---
Get-TwosComplementRange -Bits 3                     # Min -4, Max 3, Count 8
Get-TwosComplementRange -Bits 8                     # Min -128, Max 127, Count 256

Add-TwosComplement -A 7  -B -5 -Bits 4              # 2,  Overflow = False
Add-TwosComplement -A -3 -B -5 -Bits 4              # -8, Overflow = False
Add-TwosComplement -A -4 -B -4 -Bits 3              # -8, Overflow = True  (!)

Zusammenfassung

  • Mit n Bits sind immer 2ⁿ Zahlen darstellbar.
  • Wertebereich: normal [0 ; 2ⁿ−1], Zweierkomplement [−2ⁿ⁻¹ ; 2ⁿ⁻¹−1].
  • Ein Computer subtrahiert durch Addition des Zweierkomplements – der Übertrag links wird verworfen.
  • Überlauf droht, sobald das Ergebnis den Wertebereich verlässt (gleiches Vorzeichen rein, anderes raus).

👈 Zurück zu Teil 1: negative Zahlen darstellen & umrechnen, falls du die Grundlagen der 2K-Darstellung auffrischen willst.

Weiterlesen

$ Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert