2-Komplement
Heutiger Standard für signed int: Negation durch Bitflip plus eins, eindeutige Null.
Eingaben oben setzen und Berechnen drücken, dann wird die Schritt-für-Schritt-Rechnung angezeigt.
Funktionsweise und Bereich
Die 2-Komplement-Codierung c2K,n ist der De-facto-Standard für signed-Datentypen in allen modernen Prozessoren. Im Gegensatz zum 1-Komplement hat die Null genau einen Code (0…0), und Bitmuster mit führender 1 sind ausnahmslos negativ. Der Wertebereich reicht von −2n-1 bis 2n-1 − 1; er ist asymmetrisch und enthält eine negative Zahl mehr als positive, bei n = 8 also −128 bis +127, bei n = 32 etwa ±2,15 Milliarden. Eine nichtnegative Zahl wird wie bei c2,n codiert; für negative Zahlen wird |x| binär codiert, anschließend werden alle Bits gekippt und +1 addiert, formell c2K,n(−x) = c2,n(2n − x). Bei der Decodierung trägt das höchstwertige Bit das Sondergewicht −2n-1, der Rest wird wie bei c2,n gelesen: (bn-1 … b0)2K,n = −bn-1 · 2n-1 + ∑ bi · 2i. Die große Stärke ist die einheitliche Arithmetik: Addition läuft als gewöhnliche binäre Addition modulo 2n, ohne Sonderfälle und ohne Bitflip; ein Hardware-Addierer reicht für signed und unsigned gemeinsam. Eine subtile Falle ist, dass −2n-1 keinen positiven Gegenpart hat und Negation derselben Zahl wieder dieselbe Zahl liefert: in C ist `-INTMIN == INTMIN`, und ein signed Überlauf ist undefined behavior.
Wann verwenden?
In C verwenden alle signed-Datentypen 2-Komplement: signed char, short, int, long und long long. Praktisch alle x86-, ARM-, RISC-V- und MIPS-Prozessoren bauen auf 2-Komplement, und der C23-Standard schreibt es seit 2023 explizit vor. Die durchgängige Einheits-Arithmetik (signed und unsigned auf Bit-Ebene identisch) hat das Format gegen 1-Komplement und Sign-Magnitude durchgesetzt.