Dvojkový doplněk ( někdy „ dvojkový doplněk“ ) je nejběžnějším způsobem reprezentace záporných celých čísel v počítačích . Umožňuje nahradit operaci odčítání operací sčítání a učinit operace sčítání a odčítání stejné pro čísla se znaménkem i bez znaménka , což zjednodušuje architekturu počítače . V anglické literatuře se „ reverzní kód “ nazývá „ doplněk jedniček“ a „další kód“ se nazývá „ dvojkový doplněk“ .
Dodatečný kód pro záporné číslo lze získat invertováním jeho binárního modulu a přidáním jedničky k inverzi nebo odečtením čísla od nuly.
Kód doplňku dvojky je definován jako hodnota získaná odečtením čísla od největší mocniny dvou (z 2 N pro doplněk N-bitové sekundy).
Při zápisu čísla do doplňkového kódu je nejvýznamnější bit znaménko. Pokud je hodnota nejvýznamnějšího bitu 0, znamená to, že zbývající bity obsahují kladné binární číslo , které odpovídá přímému kódu .
Osmibitové binární číslo se znaménkem dvojky může představovat jakékoli celé číslo mezi -128 a +127 . Pokud je nejvýznamnější bit nula, pak největší celé číslo, které lze zapsat do zbývajících 7 bitů, je .
Příklady:
Desetinná reprezentace |
Binární reprezentace (8 bitů), kód: | ||
---|---|---|---|
rovný | zadní | další | |
127 | 0111 1111 | 0111 1111 | 0111 1111 |
jeden | 0000 0001 | 0000 0001 | 0000 0001 |
0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | |
-jeden | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-čtyři | 1000 0100 | 1111 1011 | 1111 1100 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
-6 | 1000 0110 | 1111 1001 | 1111 1010 |
-7 | 1000 0111 | 1111 1000 | 1111 1001 |
-osm | 1000 1000 | 1111 0111 | 1111 1000 |
-9 | 1000 1001 | 1111 0110 | 1111 0111 |
-deset | 1000 1010 | 1111 0101 | 1111 0110 |
-jedenáct | 1000 1011 | 1111 0100 | 1111 0101 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | --- | --- | 1000 0000 |
Stejný princip může být také použit v počítačové reprezentaci jakékoli číselné soustavy , například pro desetinná čísla .
Hodnota aktuálních číslic čísla se nezmění, ale přidá se znaménko nejvýznamnější číslice, jejíž hodnota je 0. Například číslo [+12'345] bude mít následující zobrazení - [012'345 ]
Záporné čísloPřidáme znaménko vyšší číslice rovnající se největší číslici této číselné soustavy , v našem případě je to 9, a také změníme zbývající číslice podle určitého pravidla; nechť je hodnota číslice každé číslice reprezentována proměnnou x , kromě znaménka jedna, pak si představte následující algoritmus akcí:
Myšlenka reprezentace desetinného (stejně jako jakéhokoli jiného) čísla ve dvojkovém doplňkovém kódu je identická s pravidly pro binární číselný systém a může být použita v hypotetickém procesoru:
Obvyklé
výkon |
Rovný
kód |
První
přidání |
Druhý
přidání |
---|---|---|---|
... | ... | ... | ... |
+13 | 0'0013 | 0'0013 | 0'0013 |
+12 | 0'0012 | 0'0012 | 0'0012 |
+11 | 0'0011 | 0'0011 | 0'0011 |
+10 | 0'0010 | 0'0010 | 0'0010 |
+9 | 0'0009 | 0'0009 | 0'0009 |
+8 | 0'0008 | 0'0008 | 0'0008 |
... | ... | ... | ... |
+2 | 0'0002 | 0'0002 | 0'0002 |
+1 | 0'0001 | 0'0001 | 0'0001 |
+0 | 0,0000 | 0,0000 | 0,0000 |
-0 | 9 0000 | 9,9999 | 0,0000 |
-jeden | 9'0001 | 9'9998 | 9,9999 |
-2 | 9'0002 | 9'9997 | 9'9998 |
-3 | 9'0003 | 9'9996 | 9'9997 |
-čtyři | 9'0004 | 9'9995 | 9'9996 |
... | ... | ... | ... |
-9 | 9'0009 | 9,9990 | 9'9991 |
-deset | 9'0010 | 9'9989 | 9,9990 |
-jedenáct | 9'0011 | 9'9988 | 9'9989 |
-12 | 9'0012 | 9'9987 | 9'9988 |
-13 | 9'0013 | 9'9986 | 9'9987 |
Obě čísla jsou reprezentována dvojkovým doplňkem. Doplňkový kód obou čísel má stejný počet číslic. V tomto znázornění se čísla sčítají.
Znaky jsou různé: Pokud se v procesu sčítání vytvoří číslice, která přesahuje počáteční čísla, pak se vynechá. Výsledná hodnota je považována za kladnou , pokud jsou přímý a dvojkový doplňkový kód identické. V opačném případě negativní ve formě dodatečného kódu .
Například:
Znaky jsou stejné:
Například:
Převod čísla z přímého kódu na další se provádí podle následujícího algoritmu.
Příklad. Převedeme záporné číslo −5 zapsané v přímém kódu na doplňkový kód. Přímý kód pro záporné číslo -5:
1000 0101Invertujeme všechny číslice čísla kromě znaménka, čímž získáme inverzní kód (první sčítání) záporného čísla -5:
1111 1010Přidejme k výsledku 1, čímž získáme další kód (druhý doplněk) záporného čísla -5:
1111 1011Podobný algoritmus se používá k převodu záporného čísla -5 zapsaného v kódu doplňku dvojky na kladné číslo 5 zapsaného v přímém kódu. A to:
1111 1011Invertujeme všechny číslice záporného čísla -5, čímž získáme kladné číslo 4 v přímém kódu:
0000 0100Přidáním 1 k výsledku dostaneme kladné číslo 5 v přímém kódu:
0101A zkontrolujte přidáním dalšího kódu
0000 0101 + 1111 1011 = 0000 0000, pátá a vyšší číslice se vyřadí.V systému p -adických čísel se změna znaménka čísla provádí převodem čísla na jeho doplňkový kód. Pokud je například číselná soustava 5, pak opak 0001 5 (1 10 ) je 4444 5 (−1 10 ).
Pokud čtete data ze souboru nebo oblasti paměti, kde jsou uložena ve dvou doplňcích (například soubor WAVE), může být nutné převést bajty. Pokud jsou data uložena v 8 bitech, hodnoty 128-255 musí být záporné.
Rozšíření znaménka (angl. Sign extension ) - operace s binárním číslem, která umožňuje zvýšit počet bitů při zachování znaménka a hodnoty. Provádí se sčítáním číslic od nejvýznamnější číslice. Pokud je číslo kladné (nejvýznamnější číslice je 0), přičtou se nuly, pokud je záporné (nejvýznamnější číslice je 1), přidají se jedničky.
Desetinné číslo | binární číslo
(8 číslic) |
binární číslo
(16 číslic) |
---|---|---|
deset | 0000 1010 | 0000 0000 0000 1010 |
−15 | 1111 0001 | 1111 1111 1111 0001 |