A fixpontos számokat rendszerint 16 biten vagy 32 biten ábrázolják. Ha csak nemnegatív számokat kell ábrázolni, akkor a 16 biten ábrázolható legnagyobb szám a 216-1. (A legkisebb természetesen a 0.)
Ha negatív számokat is ábrázolni kell, akkor a negatív és pozitív számok megkülönböztetésére használható lenne az ún. előjelbit, vagyis a számok legelső (legnagyobb helyiértékű) bitje. Az, hogy mégse ezt szokták mindig alkalmazni, arra vezethető vissza, hogy a negatív számokat olyan formában érdemes tárolni, hogy a gépi kivonás összeadással legyen helyettesíthető. (Ekkor csak egyetlen aritmetikai műveletet kellene a szg-nek tudnia.)
Az érthetőség kedvéért nézzük a 10-es számrendszert és vegyük azt az esetet, mikor az ábrázolásra 3 pozíció áll rendelkezésre! (Itt is igaz, hogy a legnagyobb ábrázolható pozitív szám a 103-1, azaz a 999.
Vegyük a 543-at! Ezt vonjuk ki a 999-ből! Az eredmény 456.
543
+456
----
999
Tehát a 456 az a szám, amely a 543-at csupa 9-esből álló számra egészíti ki (3 pozíción). Ezt a számot szokás az 543 kilences komplementerének (komplemensének, kiegészítőjének) nevezni. (Általában a p alapszámú számrendszerben egy szám p-1-es komplemensén, azt a számot értjük, amely a számot csupa p-1 jegyűre egészíti ki n pozíción.)
Adjunk most a 456-hoz 1-et! 457 lesz az eredmény.
543
+457
----
1000
A 457-et az 543 tízes komplemensének hívjuk. (Az a szám, mely a p alapszámú számrendszerben a számot p-re egészíti ki n pozíción, a szám p-s komplemensének nevezzük. Ezt a p-1-es komplemenshez történő 1 hozzáadásával kapjuk.)
Végezzük el a következő kivonást! (3 pozíción decimális szr-ben)
814
-123
----
691
Ezt a kivonást másképp is elvégezhetjük: 814 - 123 = 814 + (1000 - 123) - 1000
Lépésenként: Először vegyük a 123 tízes komplemensét! Ez (3 pozíción) 877. Most ezt adjuk hozzá a 814-hez!
814
+877
----
1691
Az eredményből elveszünk 1000-et, vagyis elhagyjuk a legnagyobb helyiértékű számjegyét. Ezt a szg. automatikusan le is vágja, hiszen a szám ábrázolásához csak 3 pozició áll rendelkezésre. Ezzel a módszerrel sikerült a kivonást egy p-s komplemens képzésre és egy összeadásra visszavezetni.
Viszont a komplemens képzés is kivonás!!! DE bináris szr-ben ez máshogy is elvégezhető. A kettes szr-ben a p-1-es komplemens nem más, mint az 1-es komplemens. Így a komplemes képzésekor az 1-esekhez 0-kat, a 0-khoz pedig 1-eseket kell adni, hogy minden pozíción 1 legyen.
11100010 -> Ez az eredeti szám.
+00011101 -> Ez az 1-es komplemens.
---------
11111111 -> Ez pedig a két szám összege.
Nézzünk egy másik példát!
Ábrázoljuk 8 biten a -1112 számot 2-es komplemens formában!
00000111 -> Ez az eredeti szám.
11111000 -> Ez az 1-es komplemens.
11111001 -> Ez a 2-es komplemens.
A 2-es komplemenst tehát ha hozzáadjuk egy 8 bites számhoz, akkor az ugyanaz, mintha 111-et kivontunk volna belőle, hiszen a legmagasabb helyiértékű bit elvész. Ezért szokták a negatív számokat a 2-es komplemensükkel ábrázolni/tárolni.
Van még egy probléma!!!
Hogyan lehet eldönteni pl. az 10101010 számról, hogy milyen előjelű? Pozitív-e vagy egy másik szám 2-es komplemense? A felírásból ezt sehogy sem lehet megállapítani. Ezért van szükség egy egyezményre, mely szerint 8 biten a legnagyobb ábrázolható pozitív szám a 28-1 legyen! Ez azt jelenti, hogy a nemnegatív számok az alsó 7 bitet foglalják el, míg a negatív számoknak megfelelő 2-es komplemenseknek a legnagyobb helyiértékű bitje legyen 1! Vagyis:
A pozitív számok a
00000000
és
01111111
között, míg
a negatív számok kettes komplemensei(!)
10000000
és
11111111
között helyezkednek el.
Ha ezt átszámítjuk, akkor egy 1 bájtos egész szám értéke -128 és 127 közötti.
Ebben a tartományban a nemnegatív számok legmagasabb bitje mindig 0, a negatívoké pedig mindig 1. Ezért szokás ezt a bitet előjel bitnek hívni.
Ha az előzőeket 16 biten játszottuk volna el, akkor ott a(z egész) számok -32768 és 32767 közé estek volna.
Ha egy ábrázolt számot vissza kell alakítani, akkor első lépésként meg kell nézni, hogy mi a legmagasabb helyiértékű bitje.
Ha 0, akkor csak simán átváltjuk a számot, mivel az pozitív.
Ha 1, akkor az egy negatív szám kettes komplemense. Ebből úgy kapjuk vissza az eredeti számot, hogy ennek a bináris számnak vesszük a kettes komplemensét. (Egy szám kettes komplemensének a kettes komplemense az eredeti szám. :-))
Tehát: A fixpontos számábrázolásnál a nemnegatív számokat binárisan, míg a negatív számokat bináris alakjuk 2-es komplemenseként tároljuk/ábrázoljuk.
Egész számok ábrázolására létezik még az eltolt (más néven többletes vagy feszített előjeles vagy alapértékes), illetve az előjeles módszer is, DE ha fixpontos számábrázolást emlegetnek, akkor a komplementeres ábrázolást kell érteni alatta!
Példa_1:
Ábrázoljuk 16 biten, fixpontosan a 135-öt!
Mivel a feladat mást nem ír elő, ezért ilyenkor a kettes komplemens képzést értjük a fixpontos ábrázolás alatt. A 135 pedig egy pozitív szám, tehát csak simán átt kell váltani kettesbe, majd kiegészíteni 16 bitre!
135 = 0000 0000 1000 01112
Példa_2:
Ábrázoljuk 8 biten, fixpontosan a −35-öt!
Ez egy negatív szám lévén a legmagasabb helyiértékű bit 1 lesz. Ezek után átváltjuk a 35-öt.
35 = 1000112
Negatív számokat a kettes komplemensükkel ábrázoljuk. Tehát a következő lépés, hogy a 1000112-et kiegészítjük 8 bitre.
35 = 001000112
A 001000112 kettes komplemense, vagyis a megoldás: 1101 11012
Példa_3:
Melyik számot jelenti az 1000 0001 1100 1101, ha tudjuk, hogy a tárolás 16 biten, fixpontosan történt?
Mivel a legmagasabb helyi értékű bit 1, ezért egy negatív számról van szó.
Így most már azt is tudjuk, hogy a "maradék szám", vagyis a 000 0001 1100 1101 egy szám kettes komplemense. De melyik számé? A választ megkapjuk, ha vesszük a kettes komplemens kettes komplemensét. :-)
A 000 0001 1100 11012 kettes komplemense: 111 1110 0011 00112
111 1110 0011 00112 = 3230710
Tehát az ábrázolt szám: −3230710
Nincsenek megjegyzések:
Megjegyzés küldése