Existují tři různé způsoby, jak reprezentovat celé číslo se znaménkem (článek) . a: bit se znaménkem, b: doplněk 1 a c: doplněk 2. Pokusme se pochopit, jak tyto metody vznikly a proč je doplněk 2 preferován před ostatními.
Jak víme, data jsou uložena v bitech. Jak můžeme uložit celé číslo se znaménkem do paměti? Abychom tento problém vyřešili, nejprve vyvineme naivní řešení a poté jej budeme opakovat, dokud nebudeme mít nejlepší řešení pro náš problém.
a) Podepsaný bit
Při pokusu o uložení celého čísla se znaménkem se zdá být zřejmé, že ponecháte bit nejvíce vlevo pro znaménko a zbývající bity použijete ke skutečnému uložení hodnot. Například: ve 4bitovém systému bude první bit zleva rezervován pro znaménko (0 představuje kladné, zatímco 1 představuje záporné) a další 3 bity budou použity k uložení hodnot. Podobně v 8bitovém systému bude první bit zleva použit pro znaménko a zbývajících 7 bude použito pro hodnoty.
pan č. | Binární reprezentace | Desetinná hodnota |
A | 0000 | +0 |
B | 0001 | +1 |
C | 0010 | +2 |
D | 0011 | +3 |
Afont gimp | 0100 | +4 |
F | 0101 | +5 |
G | 0110 | +6 |
H | 0111 | +7 |
já | 1000 | -0 |
J | 1001 | -1 |
K | 1010 | -2 |
L | 1011 | -3 |
M | 1100 | -4 |
N | 1101 | -5 |
Ó | 1110 | -6 |
P | 1111 | -7 |
Pomocí tohoto přístupu jsme úspěšně schopni reprezentovat celé číslo se znaménkem. Ale když to analyzujeme podrobněji, můžeme pozorovat následující nevýhody:
1) Dvě reprezentace nuly:
Ve 4bitovém systému bychom měli být schopni uložit 16 (24) hodnot, ale +1 až +7 a -1 až -7 je pouze 14 hodnot. Kde jsou zbývající dvě hodnoty? Když tabulku pozorně sledujeme, zjistíme, že tyto dvě hodnoty konvergují k 0. Máme tedy dvě zobrazení nuly, tedy jedno zobrazení pro +0 a druhé pro -0.
Jsou ale dvě reprezentace 0 velkým problémem? No a co? Místo 16 jedinečných hodnot jsme schopni uložit pouze 15 hodnot. Můžeme si dovolit snížit rozsah o 1, ne? Pro vývojáře softwaru to nemusí být důležité, ale pro návrháře obvodů může být velmi frustrující nejprve zkontrolovat, zda je hodnota +0, a poté zkontrolovat, zda je -0.
2) Rozšíření se znaménkem nefunguje pro záporná čísla:
Velikost dat rychle roste. Nějaký čas potřebujeme rozšířit bitový systém, abychom mohli zvětšit rozsah dat, která lze uložit. V roce 2014 video Gangnam Style překročilo limit zobrazení YouTube a donutil YouTube upgradovat počet zhlédnutí z 32bitových na 64bitové celé číslo se znaménkem. Podobně 32bitové unixové hodiny přetečou 19. ledna 2038, protože zaznamenávají čas v sekundách ve 32bitovém celém čísle se znaménkem.
Je tedy stejně důležité, aby byl náš reprezentační systém snadno rozšiřitelný, což u tohoto reprezentačního systému není možné.
Desetinný | 4bitový | 5bitový | 6bitový |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1010 | 10010 (!= 11010) | 100010 (!= 111010) |
-7 | 1111 | 10111 (!= 11111) | 100111 (!= 111111) |
3) Binární sčítání nefunguje:
Zkusme sečíst dvě binární čísla:
Binární | Desetinný | Binární | Desetinný | Binární | Desetinný | |||
Číslo 1 | 0010 | +2 | 0111 | +7 | 1101 | -5 | ||
Číslo 2 | 1010 | -2 | 1010 | -2 | 0011 | +3 | ||
Binární sčítání | 1100 | -4 | 0001 | +1 | 0000 | +0 | ||
Desetinné sčítání | +0 | +5 | -2 |
Proč zde nefunguje jednoduché binární sčítání? Důvodem je, že bit znaménka (nejvíce vlevo) není obyčejný bit a není součástí skutečného čísla. Představte si situaci, kdy je třeba navrhnout hardwarové obvody tak, aby ignorovaly znaménkový bit, aby bylo možné provést sčítání, a poté připojit znaménkový bit.
Takže to byl naivní způsob, jak reprezentovat celé číslo se znaménkem. Hlavním problémem tohoto přístupu je, že jsme namapovali záporná čísla směrem dolů. Pokud změníme náš systém mapování tak, aby byly shora dolů, některé z výše uvedených problémů budou vyřešeny.
b) 1's Co implementovat
Pokud přemapujeme naše záporná čísla shora dolů, dostaneme následující binární tabulku:
Ano ne.metoda řetězců v jazyce Java | Binární reprezentace | Desetinná hodnota | |
doplněk 1 | Podepsaný bit | ||
A | 0000 | +0 | +0 |
B | 0001 | +1 | +1 |
C | 0010 | +2 | +2 |
D | 0011 | +3 | +3 |
A | 0100 | +4 | +4 |
F | 0101 | +5 | +5 |
G | 0110 | +6 | +6 |
H | 0111 | +7 | +7 |
já | 1000 | -7 | -0 |
J | 1001 | -6 | -1 |
K | 1010 | -5 | -2 |
L | 1011 | -4 | -3 |
M | 1100 | -3 | -4 |
N | 1101 | -2 | -5 |
Ó | 1110 | -1 | -6 |
P | 1111 | -0 | -7 |
Jak získat binární reprezentaci celého čísla v metodě doplňku 1?
- Kladná čísla jsou reprezentována podobně jako metoda celých čísel se znaménkem
- Záporná čísla jsou reprezentována invertováním každého bitu odpovídajícího kladného čísla (invertování lze snadno provést pomocí brány NOT během návrhu hardwaru)
Pojďme to podrobně analyzovat, abychom zjistili, zda jsme dosáhli nějakého zlepšení.
1) Dvě reprezentace nuly:
V tomto přístupu také máme dvě reprezentace nuly.
2) Rozšíření se znaménkem nefunguje pro záporná čísla:
Podepsané rozšíření funguje perfektně pro záporná čísla.
Desetinný | 4bitový | 5bitový | 6bitový |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1101 | 11101 | 111101 |
-7 | 1000 | 11 000 | 111 000 |
3) Binární sčítání funguje s upravenými pravidly:
Binární | Desetinný | Binární | Desetinný | Binární | Desetinný | |||
Číslo 1 | 0010 | +2 | 0111 | +7 | 1010 | -5 | ||
Číslo 2 | 1101 | -2 | 1101 | -2 | řetězec jako pole | 0011 | +3 | |
Binární sčítání | 1111 | -0 | 0100 | +4 | 1101 | -2 | ||
Desetinné sčítání | +0 | +5 | -2 |
Odpověď není vždy správná, ale je velmi blízko správné odpovědi. Můžeme to udělat, pokud budeme dodržovat pravidlo, že pokud jste vytvořili přenos vpřed na svém nejvíce levém bitu, nevyhazujte jej, místo toho jej vraťte zpět a přidejte jej k nejvíce pravému bitu.
Binární | Desetinný | Binární | Desetinný | Binární | Desetinný | |||
Číslo 1 | 0111 | +7 | 1110 | -1 | 0111 | +7 | ||
Číslo 2 | 1101 | -2 | 1001 | -6 | 1011 | -4 | ||
Binární sčítání | (1) 0100 | +4 | (1) 0111 | +7 | (1) 0010 | +2 | ||
Přidání přenosu vpřed zpět | 0101 | +5 | 1000 | -7 | 0011 | +3 |
Metoda doplňku 1 je rozhodně lepší než bit se znaménkem. Naše hlavní obavy jsou vyřešeny, ale zůstávají problémem (mají dvě reprezentace nuly) a náš hack v binárním sčítání poskytuje vodítka ke zlepšení metody komplementu 1. Pojďme si ty věty přeformulovat, aby to bylo jednodušší.
- Máme navíc zastoupení nuly, což je zbytečné
- Při sčítání dvou binárních čísel, pokud máme přenos v levém nejvíce bitu, musíme k výsledku přidat +1, tj. správnou odpověď lze najít přechodem dolů na další řádek v binární tabulce.
Oba nás nasměrují, že extra reprezentace nuly je hlavní příčinou problému. Odeberme tedy tuto nulu navíc a přesuňte všechny záporné hodnoty na další řádek (-7 se přesune z I -> J, -6 se přesune z J -> K a tak dále…)
c) Doplněk 2
Když odstraníme -0 z tabulky doplňků 1 a posuneme všechny záporné hodnoty o jeden řádek níže, dostaneme následující tabulku, která se nazývá doplněk 2:
Ano ne. | Binární reprezentace | Desetinná hodnota | |||
doplněk 2 | doplněk 1 | Podepsaný bit | |||
A | 0000 | +0 | +0 | +0 | |
B | 0001 | +1 | +1 | +1 | |
Cforeach java | 0010 | +2 | +2 | +2 | |
D | 0011 | +3 | +3 | +3 | |
A | 0100 | +4 | +4 | +4 | |
F | 0101 | +5 | +5 | +5 | |
G | 0110 | +6 | +6 | +6 | |
H | 0111 | +7 | +7 | +7 | |
já | 1000 | -8 | -7 | -0 | |
J | 1001 | -7 | = inverzní k 7 + 1 bit | -6 | -1 |
K | 1010 | -6 | = inverzní k 6 + 1 bit | -5 | -2 |
L | 1011 | -5 | = inverzní k 5 + 1 bit | -4 | -3 |
M | 1100 | -4 | = převrácená hodnota 4 + 1 bit | -3 | -4 |
N | 1101 | -3 | = převrácená hodnota 3 + 1 bit | -2 | -5 |
Ó | 1110 | -2 | = převrácená hodnota 2 + 1 bit | -1 | -6 |
P | 1111 | -1 | = inverzní k 1 + 1 bit | -0 | -7 |
Jak získat binární reprezentaci celého čísla v metodě komplementu 2?
- Kladná čísla jsou reprezentována podobně jako metoda celých čísel se znaménkem
- Záporná čísla jsou reprezentována invertováním každého bitu odpovídajícího kladného čísla a poté k němu přičtením 1 bitu
1) Jedno zobrazení nuly:
Nyní máme pouze jednu reprezentaci nuly a ta nám umožňuje ukládat celkem 16 jedinečných hodnot (+0 až +7 a -1 až -8).
2) Rozšíření se znaménkem funguje pro záporná čísla:
Podepsané rozšíření funguje perfektně pro záporná čísla.
Desetinný | 4bitový | 5bitový | 6-bit |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1110 | 11110 | 111110 |
-7 | 1001 | 11001 | 111001 |
3) Binární sčítání:
Binární | Desetinný | Binární | Desetinný | Binární | Desetinný | Binární | Desetinný | ||||
Číslo 1 | 0010 | +2 | 0111 | +7 | 1011 | -5 | 1111 | -1 | |||
Číslo 2 | 1110 | -2 | 1110 | -2 | 0011 | +3 | 1010 | -6 | |||
Odpovědět | 0000 | +0 | 0101 | +5 | 1110 | -2 | 1001 | -7 |
4) První bit je bit se znaménkem:
Doplněk 2 má tu příjemnou vlastnost, že první bit je znaménkový bit, protože všechny kladné začínají 0, zatímco všechny záporné 1.
5) Kontrola přetečení paměti:
Při přidávání jsme se ujistili, že naše odpověď je v rámci rozsahu, ale při navrhování hardwaru je třeba detekovat přetečení paměti. Pro návrháře hardwaru bude velmi špatný nápad kontrolovat velikost, aby zachytili přetečení. Metoda doplňku 2 poskytuje velmi jednoduchý způsob, jak detekovat přetečení paměti. já f přenos do bitu se znaménkem se nerovná provádění bitu se znaménkem, pak jde o přetečení paměti tj. pokud přenos do bitu se znaménkem je 0, ale provádění je 1 nebo pokud přenos 1, ale provádění je 0, pak se jedná o přetečení paměti.
rozvětvené stromy
Binární | Desetinný | Binární | Desetinný | Binární | Desetinný | Binární | Desetinný | ||||
Číslo 1 | 1011 | -5 | 0010 | 2 | 0111 | +7 | 1011 | -5 | |||
Číslo 2 | 1100 | -4 | 0110 | 6 | 1110 | -2 | 0011 | 3 | |||
Přidání | (1) 0111 | (0)1000 | (1)0101 | (0)1110 | |||||||
nést do podepsat bit | 0 | přetékat | 1 | přetékat | 1 | Ne | 0 | Ne | |||
provést podepsat bit | 1 | 0 | 1 | 0 |