2018. február 5., hétfő

Számábrázolás – Fixpontos számok

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