# 2-Komplement visualisieren: signed integer in Hardware und C

> Zweierkomplement mit n Bit interaktiv: Negation durch Kippen aller Bits plus 1, eindeutige Null, asymmetrischer Wertebereich. Standard für int8 bis int32.

Adresse: https://marckimmel.de/informatik/zahlenkodierungen/zweierkomplement
English version: https://marckimmel.de/en/informatik/zahlenkodierungen/zweierkomplement.md

Heutiger Standard für signed int: Negation durch Bitflip plus eins, eindeutige Null.

Die 2-Komplement-Codierung c_(2K,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 −2^(n-1) bis 2^(n-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 c_(2,n) codiert; für negative Zahlen wird |x| binär codiert, anschließend werden alle Bits gekippt und +1 addiert, formell c_(2K,n)(−x) = c_(2,n)(2^n − x). Bei der Decodierung trägt das höchstwertige Bit das Sondergewicht −2^(n-1), der Rest wird wie bei c_(2,n) gelesen: (b_(n-1) … b_0)_(2K,n) = −b_(n-1) · 2^(n-1) + ∑ b_i · 2^i. Die große Stärke ist die einheitliche Arithmetik: Addition läuft als gewöhnliche binäre Addition modulo 2^n, ohne Sonderfälle und ohne Bitflip; ein Hardware-Addierer reicht für signed und unsigned gemeinsam. Eine subtile Falle ist, dass −2^(n-1) keinen positiven Gegenpart hat und Negation derselben Zahl wieder dieselbe Zahl liefert: in C ist `-INT_MIN == INT_MIN`, und ein signed Überlauf ist undefined behavior.

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.

## Weiter

- [Zahlenkodierungen](https://marckimmel.de/informatik/zahlenkodierungen.md)
