View Single Post
Staro 01.04.2008., 01:15   #7
munst0r
Premium
Moj komp
 
munst0r's Avatar
 
Datum registracije: Mar 2004
Lokacija: Bjelovar/Zagreb
Postovi: 357
Citiraj:
Autor expozed Pregled postova
ako se pretvori taj broj u decimalni ispada:
11101110(2)=(-2)^7 + 2^6 + 2^5 + 2^3 + 2^2 + 2^1 = -128 + 110 = -18
Nije to dobro...
Dok pretvaras iz binarnog broja u dekadski uvijek je 2^nesto. Ne moze biti -2 nikada. Sta da smo imali zapis na 9 bitova? Tada bi ti prvi bit bio na osmu potenciju. A to je pozitivan broj...


A sad, da bi mogli reci na koji nacin ispravno oduzeti veci od manjeg binarnog broja, prvo moramo tocno definirati problem, tj. situaciju u kojoj se nalazimo (nacin na koji zapisujemo negativne binarne brojeve).


1. opcija: Negativne binarne brojeve zapisujemo isto kao i dekadske. Dakle, samo nakeljimo '-' ispred broja.

U ovom slucaju je situacija prilicno jasna. Oduzimanje cemo obaviti isto kao sto bi to napravili i s dekadskim brojevima. Okrenut cemo redoslijed brojeva i normalno oduzeti manji od vecega. Zatim ispred rezultata samo nakeljimo - i eto nam rjesenja.

No, moram reci da je ova siutacija dosta rijetka. Mozda nije neobicna negdje gdje se samo uci malo racunati s binarnim brojevima. Ali, u svijetu racunala takvo sto ne postoji.


2. opcija: Ne podrzavamo negativne binarne brojeve.

To je kao da pri deklaraciji varijable u nekom programskom jeziku (koji to podrzava) stavimo "unsigned" (samo pozitivni brojevi).
Primjer u C-u bi glasio:
unsigned int pero;

Dakle, ako koristimo 8 bita za prikaz broja, onda znaci da baratamo s brojevima iz raspona [0-255].

Ajmo to pokazati na primjeru.

Racunamo 19 - 37.
19 = 00010011
37 = 00100101

Prvo nalazimo dvojni komplement od 37.

11011010
+
00000001
---------
11011011

Sada zbrojimo 19 i dvojni komplement od 37.

00010011
+
11011011
---------
11101110 = 238

Dobili smo 238. I u ovom slucaju je to sasvim ispravan rezultat i s njime vise nista ne treba raditi. Jedino, valja primijetiti da je 238 - (255 + 1) = -18. A to je upravo onaj rezultat koji bi ocekivali u dekadskom sustavu.


3. opcija: Prvi bit koristimo kao bit predznaka.


Ako i sada koristimo 8 bitova za prikaz brojeva, onda mozemo raditi s rasponom [-128, 127] (opet je to 255 brojeva ukupno).

No, sto tocno znaci da nam prvi bit predstavlja predznak? To znaci ako je taj bit 0, onda imamo pozitivan broj, a ako je 1, onda imamo negativan broj. No, necemo tu jedinicu samo zanemariti i razmisljati o njoj kao o obicnom minusu, a o ostalih 7 bitova kao o pravom broju, nego je i ta jedinica dio broja.

Konkretno, to znaci sljedece.
Ako imamo broj kojemu je prvi bit 0, onda je to najobicniji pozitivni binarni broj i mozemo ga odmah pretvoriti u dekadski broj (na dobro poznati nacin).
No, ako je prvi bit 1, onda cemo prvo taj broj dvojno komplementirati i tek onda ga pretvoriti u dekadski broj.

Evo primjera:
(ovo je copy/paste prethodnog primjera s malo dodatka na kraju)

Racunamo 19 - 37.
19 = 00010011
37 = 00100101

Prvo nalazimo dvojni komplement od 37.

11011010
+
00000001
---------
11011011

Sada zbrojimo 19 i dvojni komplement od 37.

00010011
+
11011011
---------
11101110

Dobili smo nas rezultat, ali vidimo da je prvi bit 1, pa cemo ga dvojno komplementirati prije pretvorbe u dekadski sustav. Komplement je 00010010. A to je broj 18. Naravno, mi znamo da je on negativan, pa mozemo napisati -18.
munst0r je offline   Reply With Quote