Dvojkový doplněk

Dvojkový doplněk (též doplňkový kód) je způsob kódování celých, tedy kladných i záporných čísel ve dvojkové soustavě používaný v počítačích. Dvojkový doplněk umožňuje zjednodušit konstrukci aritmeticko-logické jednotky uvnitř procesoru díky tomu, že sčítání a odečítání se provádí pro čísla se znaménkem stejně jako pro čísla bez znaménka, odlišná je pouze interpretace přetečení. Odečítání lze převést na sečtení prvního operandu s dvojkovým doplňkem druhého. Dvojkový doplňkový kód je nejrozšířenějším způsobem reprezentace celých čísel se znaménkem v počítači.

Výhody a nevýhody

K výhodám dvojkového doplňku patří, že neexistuje kladná a záporná nula (jako u jedničkového doplňku). Nevýhodou je naopak fakt, že zobrazený interval je nesymetrický (např. −128 až 127 v případě osmibitových čísel nebo −32768 až 32767 v případě šestnáctibitových). Takže například nelze na daném počtu bitů vyjádřit absolutní hodnotu nejzápornějšího čísla (nejzápornější číslo je ve dvojkovém doplňku invariantní vůči negaci, stejně jako nula).

Postup kódování

Při použití dvojkového doplňku se opačné číslo získá tak, že se znegují všechny bity dvojkového zápisu čísla a k výsledku se přičte jednička. Stejného výsledku lze dosáhnout odečtením jedničky následovaném negací všech bitů. Oba postupy fungují pro kladná i záporná čísla. Při aplikaci na nejmenší zobrazitelné číslo (nejzápornější zobrazitelné číslo) je výsledkem totéž číslo (mělo by se interpretovat jako přetečení).

Jiný postup

Protože dvojkový doplněk je také neznaménkové vyjádření záporného čísla na daném rozsahu, lze ho získat jako rozdíl (maxima rozsahu +1) a absolutní hodnoty záporného čísla. Např. pro rozsah 8 bitů, kde maximum je 255, dojde při překročení rozsahu k přetečení, takže číslo 256 = 0. Potom bude znaménkovému vyjádření "-x = 0 - |x|" odpovídat neznaménkový zápis "-x = 256 - |x|".

Sčítání dvou čísel v doplňkovém kódu

Sčítání dvou kladných čísel; výsledek je kladný:

        binárně         bez znaménka   se znaménkem
       0001 1110              30              30
     + 0011 0010           +  50           +  50
     ===========           =====           =====
CF=0   0101 0000              80              80
PF=0                        (OK)            (OK)

Sčítání dvou kladných čísel; výsledek je záporný (přetečení):

        binárně         bez znaménka   se znaménkem
       0100 1011              75              75
     + 0110 0100           + 100           + 100
     ===========           =====           =====
CF=0   1010 1111             175             -81
PF=1                        (OK)         (chyba)

Sčítání záporného a kladného čísla; výsledek je záporný (přetečení při sčítání bez znamének):

        binárně         bez znaménka   se znaménkem
       1110 1100             236             -20
     + 0010 1101           +  45           +  45
     ===========           =====           =====
CF=1   0001 1001              25              25
PF=0                     (chyba)            (OK)

Sčítání záporného a kladného čísla; výsledek je záporný:

        binárně         bez znaménka   se znaménkem
       1111 0010             242             -14
     + 0000 1010           +  10           +  10
     ===========           =====           =====
CF=0   1111 1100             252              -4
PF=0                         (OK)            (OK)

Sčítání dvou záporných čísel (u čísel bez znamének dojde k přetečení):

        binárně         bez znaménka   se znaménkem
       1110 0100             228             -28
     + 1110 0111           + 231           + -25
     ===========           =====           =====
CF=1   1100 1011             203             -53
PF=0                     (chyba)             (OK)

Sčítání dvou záporných čísel (k přetečení dojde u čísel bez znamének i se znaménky):

        binárně         bez znaménka   se znaménkem
       1100 0101             197             -59
     + 1001 1011           + 155          + -101
     ===========           =====           =====
CF=1   0110 0000             96             -160
PF=1                     (chyba)         (chyba)

Je patrné, že při použití dvojkového doplňku se pro sčítání a odečítání čísel se znaménkem používají stejné operace jako pro čísla bez znaménka. Rozdíl je pouze v interpretaci čísel a ve způsobu vyhodnocování překročení číselného rozsahu: zatímco při operacích s čísly bez znaménka indikuje překročení povoleného rozsahu příznak přenosu (CF-přenos z nejvyššího bitu), při operacích se znaménkem indikuje překročení rozsahu příznak přetečení(PF- přenosy z a do nejvyššího bitu).

Výpočet rozdílu dvou čísel pomocí dvojkového doplňku

Řekněme, že máme dvě celá čísla v absolutní hodnotě 1000 0001 a 11 0110, a chceme druhé číslo odečíst od prvního.

  1. Zarovnáme počet bitů obou čísel – 1000 0001 a 0011 0110 (doplnění nul)
  2. Provedeme negaci menšitele (číslo, které je odečítáno) − 0011 0110 ⇒ 1100 1001
  3. Provedeme inkrementaci (přičtení jedničky) menšitele − 1100 1001 + 1 = 1100 1010

Dvojkový doplněk je tedy 1100 1010. Výpočet rozdílu provedeme sečtením menšence 1000 0001 a doplňku 1100 1010. Výsledkem tohoto součtu je číslo 10100 1011, kde ale musíme vynechat přenos jedničky do nejvyššího řádu. Konečným výsledkem je tedy číslo 0100 1011.

Ukázka 4bitového dvojkového doplňkového kódu

Následující příklad předvádí kódování čísel −8 až +7 (v desítkové soustavě) do čtyřbitového čísla ve dvojkové soustavě použitím dvojkového doplňku.

Dvojkový doplněkDesítkově
01117
01106
01015
01004
00113
00102
00011
00000
1111−1
1110−2
1101−3
1100−4
1011−5
1010−6
1001−7
1000−8

Z příkladu ilustruje vlastnosti čísel kódovaných v DDK, o kterých pojednává další odstavec.

Vlastnosti dvojkového doplňkového kódu

  • Označme indexy bitů 0, 1, 2, …, N-1, kde N je počet bitů čísla, nejvyšší bit má tedy index N-1
  • Uvažujme binární součet s přetečením, který používá drtivá většina počítačů

Pak platí:

  • Když je nejvyšší bit (MSB) 1, tak je číslo záporné.
  • bity 0, 1, 2, …, N-2 mají váhu 20, 21, …, 2N-2
  • bit N-1 (tj. MSB) má váhu -(2N-1); tato vlastnost je užitečná např. při násobení
  • Při kódování do N bitů je možné zakódovat čísla od do . V uvedeném příkladě je N=4, kódovaný rozsah je od −8 do 7.
  • Výsledkem binárního součtu kladného a záporného čísla ve dvojkovém doplňku je opět číslo ve dvojkovém doplňku. Například (−6 + 3)10 = (1010 + 0011)2 = 11012 = −310.
  • Kladná čísla (tj. 0 až 2N-1 – 1) mají stejné kódy jako N-bitová čísla bez znaménka
  • Výsledek sčítání nezávisí na pořadí sčítanců (i při přetečení)

Odkazy

Související články

Externí odkazy