Dvojkový doplněk

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

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[editovat | editovat zdroj]

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ý (-128 až 127 v případě osmibitových čísel, -32768 až 32767 v případě šestnáctibitových).

Postup kódování[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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 1001           +  45           +  45
     ===========           =====           =====
CF=1   0101 0000              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             219             -37
     + 0000 1010           +  10           +  10
     ===========           =====           =====
CF=0   1111 1100             229             -27
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
       1111 0010             236             -20
     + 1110 0111           + 231           + -25
     ===========           =====           =====
CF=1   1101 0011             211             -45
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, při operacích se znaménkem indikuje překročení rozsahu příznak přetečení.

Výpočet rozdílu dvou čísel pomocí dvojkového doplňku[editovat | editovat zdroj]

Ř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[editovat | editovat zdroj]

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ěk Desítkově
0111 7
0110 6
0101 5
0100 4
0011 3
0010 2
0001 1
0000 0
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[editovat | editovat zdroj]

  • 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 vlastonst je užitečná např. při násobení
  • Při kódování do N bitů je možné zakódovat čísla od -2^{N-1} do 2^{N-1}-1. 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[editovat | editovat zdroj]

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]