Slouží pro zápis záporných čísel, kladná zůstavají nezměněná. Stejně jako v přímém kódu slouží 1 na nejvyšším bitu pro identifikaci záporného čísla. Výhodou této reprezentace je, že existuje pouze jeden tvar pro reprezentaci nuly (v přímém je i záporná
nula, např. 10000000) a hlavně pro odečítání není potřeba zvláštního algoritmu, protože funguje stejně jako sčítání. To samozřejmě šetří hardware:-)
Postup: Najdi první 1 zprava, zbytek (kromě znaménkového bitu) invertuj.
00101010 | 42 v přímém kódu |
00101010 | 42 v doplňkovém kódu |
10101010 | −42 v přímém kódu |
11010110 | −42 v doplňkovém kódu |
To je snad triviální… jen pozor na přenos a přetečení.
0101 5 1001 9 +0100 4 +1010 10 ------- ------- 1001 9 10011 19 ^ Přetečení
Sčítat je možné i v doplňkovém kódu. Výsledek pak bude na stejném počtu bitů jako vstup, i když by přenos způsobil přetečení. Pro detekci přetečení se používá XOR dvou nejlevější bitů přenosu - pokud vyjde XOR 1, jde o chybu.
0111 7 v doplňkovém kódu +0001 1 v doplňkovém kódu 0111 Přenos, nejlevější bity 01, FAIL -------- 1000 −8 v doplňkovém kódu, chyba
Podobné jako sčítání, ale pokud od 0 odečteme 1, výsledek je 1 a musíme odečíst 1 (vypůjčit si) i ze sloupečku vlevo.
1001 9 −0101 5 ------- 0100 4
V doplňkovém kódu se čísla normálně sečtou.
01001 9 +11011 −5 v doplňkovém kódu 11011 Přenos, nejlevější bity 11, OK --------- 00100 4
V základním provedení docela snadné, vychází ze základního principu násobení. Bereme zleva bity z násobitele. Když je bit 0, napíšeme do mezivýsledku tolik 0 koli bitů má násobenec (nebo řádek úplně vynecháme). Když je bit 1, opíšeme do mezivýsledku násobenec. Po každám bitu z násobitele mezivýsledek o jeden bit posuneme vlevo. Nakonec sečteme mezivýsledky.
1011 ×1010 ----- 0000 1011 0000 1011 ------- 1101110
Používá se k násobení dvou čísel v se znaménkem v doplňkovém kódu. Viz Wikipedie.
V tomto zobrazení definujeme místa před a místa za řádovou čárkou. Dnes už se pro desetinná čísla téměř nepoužívá. Na klasická celá čísla se dá pohlížet jako na čísla s pevnou řádovou čárkou a 0 místy za čárkou.
Při použití pohyblivé řádové čárky se číslo definuje jako:
X YYYYYYYY ZZZZZZZZZZZZZZZZZZZZZZZ
X je znaménkový bit (1 znamená záporné), Y je exponent a Z je tzv. mantisa, která je desetinnou částí zlomku. Výsledné číslo se získá jako:
(-1)X * 2(exponent v kodu posunute nuly) * (1.Z)
Existují některé speciální stavy:
Příklad: Máme reprezentaci pomocí čtyř bitů exponentu a osmi bitů mantisy. Chceme vyjádřit číslo -10,8. Nejdřív z tohoto čísla vyhodíme zápor a pak vyhaxujeme exponent, tedy vydělíme ho takovou mocninou 2, aby vzniklo číslo v rozsahu <1,2). 10,8/8 = 1,35. Odsekneme 1. (protože počítáme s tím,ž e tam vždycky je), takže nám jako mantisa vyjde 35. Výsledné číslo v této reprezentaci bude vypadat tedy takto:
1 1000 00100011 (znamenko exponent mantisa).
Více dále ve standardech:
Ukládá binární čísla v plovoucí desetinné čárce na 32 bitech (jednoduchá přesnost) nebo 64 bitech (dvojitá přesnost). Dané číslo je rozděleno na základ a exponent. Nejlevější bit je vždy znaménkový, následuje 8 bitů pro exponent a zbylých 23 je základ. Na 64 bitech je rozdělení 1, 11, 52.