Negatív egész számok ábrázolása

Mindeddig elegánsan megkerültük a negatív számok ábrázolásának problémáját, pedig az már a fenti példa esetén (elmozdulás vagy hosszmérés) is felmerül, de ott egy másik pozitív szám visszaszámlálásával pótoltuk. Az első gondolat az volt, hogy ha egy adott szélességű (egész számú bájtokból álló) bitminta legnagyobb (MSB – Most Significant Bit) helyi értékű bitjét (ami mindig a bal oldali a legelső bájt balról vett legelső bitje) előjelként használnánk, akkor egy csapásra két egyforma méretű tartományhoz jutnánk, és lehetőség lenne (persze a tisztán pozitív ábrázoláshoz képest csak feleakkora nagyságú) negatív és pozitív számokat ábrázolni.[2]

Vegyük egy példát csak egy bájt szélességben. Ha a megállapodásunk szerint az MSB = 1 jelenti a negatív számot, és az MSB = 0 jelenti a pozitív számot, akkor az alábbi szám +3 decimálisan. Most egyenként csökkentve ezt a számot, eljutunk a nulláig.

Most próbáljunk meg −3-ból egyenkénti növeléssel eljutni a nullába. Még mielőtt azonban felírnánk pl. a −3-at, próbáljuk meg értelmezni, hogyan ábrázolhatók a negatív számok. Ha úgy okoskodunk, hogy a teljes bitmintán ábrázolható egész számok halmaza elemeinek számossága (2n) éppen/majdnem (a majdnem-et azért írjuk, mert azért van egy kis eltérés a számosságok összegében, amire később még kitérünk) a pozitív és negatív számok halmazai számosságának összege, és figyelembe vesszük, hogy ezeknek a halmazoknak nincs közös része (vagyis nincs olyan negatív szám, ami azonos lenne egy pozitívval), akkor ezek egymás kiegészítő, ún. komplementer halmazai az egész számokra nézve, sőt azonos számosságúak is, hiszen párba állíthatók.

Egyes komplemens képzés

Mivel ez azt jelenti, hogy formailag, mint bitminta sem egyezhetnek meg egymással (mert nem lehet olyan pár, ahol a pozitív és a negatív elem bitmintája azonos) és mivel egy helyi értéken két alaki érték lehet, 0 vagy 1, ezért a két diszkrét halmaz szétválasztására az alaki elemek formális felcserélésével is juthatunk. Ez világosabban fogalmazva azt jelenti, hogy ahol egy pozitív szám esetén egyest írunk, ott ugyanannak az elemnek a negatív párja esetén nullának kell állnia. Ez pedig nem más, mint a korábban a digitális alapoknál már jól ismert bitenkénti invertálás vagy negálás. Tehát most már rutinosan egy pozitívan ábrázolt számból a negatívba bitenkénti invertálással jutunk és fordítva. Ez a művelet az egyes komplementer képzés.

Visszatérve a fel- és leszámolásnál tapasztalt nulla átmenetre, azt látjuk, hogy

az bitminta nem azonos a bitmintával, és ez az egyes komplemens ábrázolásnak az egyik legnagyobb hátránya. (Vagyis két nulla van, és ezért írtuk korábban, hogy majdnem igaz az, hogy a negatív számok és a pozitív számok számossága a két nullával azonos, de a valóságban nincs két nulla, hanem a nulla nem tartozik egyik tartományhoz sem.) A hátrányt a számítási eredményeket végző digitális számító művek felesleges bonyolultsága jelenti, mert fel kellene készülni a pozitív és negatív nulla keletkezésére és a vele való műveletekre is.

Kettes komplemens képzés

Ennek megfelelően nem is terjedt el széles körben, és helyette az ún. kettes komplemens ábrázolás a megszokott, amit az alábbi meggondolással érthetünk meg. Azt láttuk, hogy az egyes komplemens képzésnél a negatív és a pozitív tartományt sikeresen szétválasztottuk, és eredményül kaptunk két teljesen egyforma számosságú halmazt, melyek elemei párba állíthatók. Sajnos még a nulla is párban fordult elő, vagyis a két tartomány elemeinek volt közös része.

Szemléletesen elképzelve, a kettes komplemens képzés úgy segít ezen, hogy a negatív tartományt mintegy „balra tolva” fedésbe hozza a negatív nullát a pozitívval. A balra tolás pedig azt jelenti, hogy minden egyes komplemensben adott számhoz egyet adunk. Például az negatív nulla éppen a pozitív nullába megy át, és így megszűnik az átmenet kettősége. A kettes komplemensre alapozva már kevésbé bonyolult ALU-kat (Aritmetikai Logikai Egység) lehetett tervezni, így ez lett a máig használt egyik legalapvetőbb számábrázolási forma. A „balra tolás” és a negatív nulla eltűnéséért pedig a pozitív tartományban ábrázolható szám csökkenésével kell fizetnünk, ami így a pozitív és a negatív tartományban különböző lesz [ – 1]. (Visszautalva a fixpontos ábrázolásra, ott is kettes komplemensben ábrázoljuk a számokat.)

A kettes komplemens képzés tehát úgy történik, hogy képezzük az egyes komplemenst, majd az eredményhez hozzáadunk egyet. Formálisan egy gyorsabb módszer, ha jobbról az első egyesig érintetlenül hagyjuk a biteket, majd az egyes után következő biteket egyenként negáljuk. Nézzünk erre is példát, megint a nulla átmenet környékét vizsgálva.

Még egy gyakorlat szülte jó tanács a gyors átszámításhoz. A „balra tolás” miatt a negatív számok formailag az egyes komplemens formához képest értékükben „csökkennek egyet”, például a olyan, mint a az egyes komplemensben. Vagyis minden negatív szám az eggyel kisebb negatív szám egyes komplemensével egyezik meg. (Tömören így szoktuk mondani például: mínusz hét kettes komplemensben az hat egyes komplemense.)

Részletesebben: ha adott egy pozitív szám, mondjuk , akkor levonunk belőle egyet, lesz hat és ennek az egyes komplemensét vesszük:

Megjegyezzük, hogy a két módszer közül az elsőt, vagyis az első egyes utáni negálást részesítik inkább előnyben a szakemberek, mert gyorsan és mechanikusan elvégezhető.

További gyakorlati következmény, hogy a kétszeri kettes komplemens képzés az eredeti számot adja vissza. A legnagyobb előnye azonban a kettes komplemens használatának, hogy általa a kivonás visszavezethető két szám összeadására. Ami nem is meglepő, ha belegondolunk, hogy az egyes komplemens képzéssel (ami ne felejtsük el, része a kettes komplemens képzésének is) szétválasztottuk a halmaz párba állítható elemeit, és a tartomány eltolásával kiküszöbölve a kettős nullát, éppen olyan bitminták keletkeztek az egyes szám helyeken, melyek azonos abszolút értékű negatív és pozitív szám összeadása esetén nullát adnak. Sőt, ha kisebb számból vonunk ki nagyobb számot, akkor az eredmény mintegy „magától” kettes komplemensben adódik.

Végezzünk el egy kivonást először úgy, hogy egy pozitív számot vonunk ki egy másik pozitív számból.

Ugyanerre az eredményre jutunk, ha kettes komplemens összeadásaként írjuk fel a fenti műveletet:

Azt már korábban is jeleztük, hogy a bináris alakú számok kezelése nem éppen könnyű és áttekinthető, ezért a bináris–hexadecimális átírás alkalmazásával (emlékszünk rá, hogy tetrádokra bontott hexa jegyek behelyettesítésével) élünk.

Sokszor felmerül a kérdés, hogyan állapítjuk meg egy negatív hexa szám decimális értékét? A kettes komplemens alkalmazásának másik előnye, hogy egy negatív szám kettes komplemense az a pozitív szám, amivel összeadva éppen nullát kapunk, vagyis a számegyenes negatív és pozitív oldalán lévő azonos abszolút értékű számpárok kettes komplemens képzéssel egymásba alakíthatók. Pl. FFD6h egy negatív szám, mennyi decimálisan?

Egy másik módszert is bemutatunk, mely egy hexadecimálisan adott szám egyes komplemensének gyors megállapítására szolgál: vonjunk ki minden hexadecimális jegyet Fh-ból (azaz 15d-ből). Pl.:

Ellenőrizzük le:

ami éppen az eredeti szám bitenkénti negálása, vagyis egyes komplemense.



[2] (Megjegyezzük, hogy korábban létezett az előjeles abszolút értékes ábrázolás, ami azt jelentette, hogy az előjel bit (1-es negatív, 0 pozitív) mögött az érték mindig abszolút értékben volt értendő, de ez az ábrázolás gyakorlati jelentőségét mára teljesen elveszítette.