You are on page 1of 9

PROGRAMIRANJE 2

LABORATORIJSKE VJEBE

LV1
Zapis cijelih i realnih brojeva u
raunalu

Elektrotehniki fakultet Osijek


Kneza Trpimira 2b

www.etfos.unios.hr

1 UVOD
Brojeve u raunalu prikazujemo binarnim brojem. Pretvorba brojeva se vri na nain opisan
i obraen na kolegiju Programiranje 1. Iako u C programskom jeziku broj bitova int i float
tipova podataka nije definiran, na sustavima koje najee sreemo su implementirani kao
32 bitni ili 64 bitni podaci. Zato emo primjere prikazivati zapisane u 32 bitne ili 64 bitne
registre.
U ovoj vjebi objasnit emo kako zapisujemo cijelobrojne i realne brojeve u memoriji
raunala.

2 ZAPIS CIJELIH BROJEVA U RAUNALU

Slika 1: Zapis cjelobrojne vrijednosti u 32 bitnom registru.


Raspon cijelih brojeva koje moemo zapisati u 32-bitni registar je od broja 0 ( nula ) do broja
4, 29 109 ( 0 do 232 - 1 ). To su pozitivni cijeli brojevi. Kako bi mogli zapisati i negativne
cijele brojeve, prvi bit s lijeve strane ( najznaajniji bit MSB ) predstavlja predznak broja a
ostalih 31 bitova odreuje vrijednost cijelog broja.
Ako je prvi bit s lijeve strane 0 ( nula ), broj zapisan u registru je pozitivan, a ako je taj bit 1,
broj je negativan. Na taj nain moemo zapisati cijele brojeve iz intervala [2.15
109 , 2.15 109 ] ( 231 + 1 231 1 ). Binarni brojevi kojima je prvi bit s lijeve strane 0
(nula) pretvaraju se u dekadske brojeve na uobiajen nain, a za brojeve kojima je bit
predznaka 1 provodi se poseban postupak.
2.1

PREBACIVANJE CIJELOG NEGATIVNOG DEKADSKOG BROJA U BINARNI 32


BITNI ZAPIS U REGISTRU

Postupak pretvaranja cijelog negativnog dekadskog broja u 32-bitni binarni zapis je


slijedei:

pamti se predznak: -
uzima se apsolutna vrijednost broja ( pozitivna vrijednost ) i taj broj se pretvara u
binarni
nad binarnim brojem se radi komplementiranje unarni komplement
unarnom komplementu se dodaje 1 kako bi se dobio dvojni komplement

Primjer:
Zadan je broj -37. Broj je potrebno prebaciti u 32-bitni binarni zapis u registru.
Uzimamo apsolutnu vrijednost
broja:
Broj 37 pretvaramo u binarni:
i nadopunjavamo ga
s nulama do 32 bita:
zatim radimo komplement:
i dodajemo 1:
i dobivamo rjeenje:

|-37| = 37
37 (10) = 100101(2)
0000 0000 0000 0000 0000 0000 0010 0101
1111 1111 1111 1111 1111 1111 1101 1010
+
1
--------------------------------------1111 1111 1111 1111 1111 1111 1101 1011

2.2

PREBACIVANJE NEGATIV NOG BINARNOG BROJA U DEKADSKI

Postupak prebacivanja negativnog binarnog broja u dekadski je slijedei:


potrebno je zapamtiti da je predznak nad binarnim brojem se radi komplement (unarni komplement) (svaki bit se
komplementira: 1 0, 0 1 )
komplementu se dodaje vrijednost 1 i unarni komplement postaje dvojni komplement
binarni broj se nakon dvojnog komplementiranja pretvara u dekadski
ispred dobivenog dekadskog broja se stavlja predznak -

Primjer:
Zadan je 32-bitni binarni broj 1000 0000 0010 1011 0000 0000 0000 0000(2) koji se nalazi u
memorijskom registru. Broj je potrebno pretvoriti u dekadski.
1000 0000 0010 1011 0000 0000 0000 0000 vidimo da je broj negativan jer
je prvi bit s lijeve strane 1.
Potrebno je napraviti
komplement binarnog broja:
koji izgleda ovako:
zatim dodajemo broj 1:
dobivamo dvojni komplement:

1000 0000 0010 1011 0000 0000 0000 0000


+

0111 1111 1101 0100 1111 1111 1111 1111


1
--------------------------------------0111 1111 1101 0101 0000 0000 0000 0000

Taj broj treba pretvoriti u dekadski:


i dodati mu predznak - pa broj iznosi:

2144665600
-2144665600

3 ZAPIS REALNIH BROJEVA U RAUNALU


Realni brojevi u raunalu mogu se zapisati na dva naina, sa nepominim zarezom te s
pominim. Zapis s nepominim zarezom se vrlo rijetko koristi jer je neprecizan i ne moe
zapisati velik raspon brojeva.
Realni brojevi zapisani na nain s pominim zarezom (float i double tip podatka u
programskom jeziku C) zapisuju se u memorijske registre veliine 32 ili 64 bita. Pri tome se
takvi zapisi zovu zapisi s jednostrukom ili dvostrukom preciznou, a definirani su IEEE 754
standardom.
3.1

IEEE 754 PRIKAZ S JEDNOSTRUKOM PRECIZNOU

Realni brojevi u raunalu (float tip podatka u programskom jeziku C) zapisuju se u


memorijske registre veliine 32 bita. Raspon realnih brojeva koje moemo zapisati u 32bitni registar je unutar sljedeih intervala:
[3.4 1038 , 3.4 1038 ; 3.4 1038 , 3.4 1038 ]
Takav broj ima 7 decimalnih znamenki.
Ako je prvi bit s lijeve strane 0 (nula) broj zapisan u registru je pozitivan, a ako je taj bit 1
broj je negativan. Kako bi se izbjegao prikaz negativnih brojeva u eksponentu dogovoreno
je da se broju u eksponentu doda broj 127.
Slijedeih 8 bitova koristi se za zapis eksponenta (E) . Zadnja 23 bita koriste se za
razlomakog dijela (f) ili mantise. Sve ove veliine prikazane su na slici 2.

Slika 2: Zapis realne vrijednosti u 32 bitnom registru.


Kako bi dobili vrijednosti mantise (f) i eksponenta (E), potrebno je broj koji zapisujemo
prvo normalizirati. To radimo tako to ga dijelimo s 2 gdje je takav da je rezultat
mnoenja u obliku 1.f. Pamtimo vrijednost potencije (p), te razlomaki dio tj. mantisu (f).
Broj 1 ispred mantise neemo zapisivati, jer se podrazujeva te ga zbog toga nazivamo
skriveni bit. Vrijednost eksponenta koju emo stvarno zapisati dobivamo formulom
= + 127. Konaan broj dobiva se formulom:
= 1. 2 = 1. 2127

3.2

PRETVARANJE BROJA IZ DEKADSKOG ZAPISA U BINARNI

Postupak pretvaranja binarnog zapisa u dekadski je identian i za pozitivne i za negativne


realne brojeve. Uzima se apsolutna vrijednost broja i ovisno o veliini broja radi se jedan od
sljedeih postupaka:
1)
o ako je broj vei ili jednak 2 broj se dijeli s 2 sve dok je vei od 2 i pamti se broj

dijeljenja (p)
o broj se dijeli s 2p
o u dio za eksponent upisuje se vrijednost E = p + 127, u binarnom zapisu (8 bita)
o razlomaki dio se rauna tako da se uzme dio broja 0.f, mnoi se s 2 te zapisuje

prijenos koji upisujemo u dio registra od 23. bita na desno


2)
o ako je broj vei od 0 i manji od 1 broj se mnoi s 2 sve dok je broj manji od 1 i pamti

se broj mnoenja (p)


o broj se dijeli s 2-p (ili mnoi s 2p)
o u dio za eksponent upisuje se vrijednost E = -p + 127, u binarnom zapisu (8 bita)
o razlomaki dio se rauna tako da se uzme dio broja 0.f, mnoi se s 2 te zapisuje

prijenos koji upisujemo u dio registra od 23. bita na desno


3)
o ako je broj vei ili jednak 1 i manji od 2 p = 0, E = 127
o razlomaki dio se rauna tako da se uzme dio broja 0.f, mnoi se s 2 te zapisuje

prijenos koji upisujemo u dio registra od 23. bita na desno

Primjer 1:
Kao primjer pokazat emo pretvaranje broja 32.5 u binarni zapis u registru za realne
brojeve.
32.5 : 25 = 1.015625
32.5 = 1.015625 25
Za prvi broj mantise je uzet broj 1 koji se ne pohranjuje u raunalo i naziva se skriveni bit.
Sada znamo: f = 0.015625 i p = 5.
E = p + 127 = 5 + 127 = 132
Binarni zapis broja 132 je 1000 0100 i taj broj se zapisuje od 31. do 24. bita u registar (E).
Sada je potrebno broj 0.015625 pretvoriti u binarni.

0.015625
0.03125
0.0625
0.125
0.25
0.5
0

x
x
x
x
x
x
x

2
2
2
2
2
2
2

=
=
=
=
=
=
=

0.03125
0.0625
0.125
0.25
0.5
1
0

0
0
0
0
0
1
0

Znai, binarni zapis razlomakog dijela glasi:


0000 0100 0000 0000 0000 000.
Primijetimo kako u ovom sluaju neemo binarne brojeve zapisivati od zadnjeg
prema prvom, kao to smo to radili kod pretvaranja dekadskih u binarne. Razlog je
u tome to ovdje mnoimo s dva, dok smo tamo dijelili.
Sada moemo zapisati cijeli binarni broj u registar:
P |---E---| |-----------f--------------|
0 1000 0100 0000 0100 0000 0000 0000 000.
U sluaju da se radilo o negativnom broju, samo bi se prvi bit promijenio u vrijednost 1.

Primjer 2:
Kao primjer pokazat emo pretvaranje broja -0.16 u binarni zapis u registru za realne
brojeve.
Broj = |-0.16| = 0.16

predznak P = 1

0.16 : 2-3 = 1.28


0.16 = 1.28 2-3
Za prvi broj mantise je uzet broj 1 koji se ne pohranjuje u raunalo i naziva se skriveni bit.
Sada znamo: f = 0.28 i p = -3
E = p + 127 = -3 + 127 = 124
Binarni zapis broja 120 je 0111 1100 i taj broj se zapisuje od 31. do 24. bita u registar (E).
Sada je potrebno broj 0.28 pretvoriti u binarni.
0.28
0.56
0.12
0.24

x
x
x
x

2
2
2
2

=
=
=
=

0.56
1.12
0.24
0.48

0
1
0
0

0.48
0.96
0.92
0.84

x
x
x
x

2
2
2
2

=
=
=
=

0.96
1.92
1.84
1.68

0
1
1
1

0.68
0.36

x 2 = 1.36
x 2 = 0.72

1
0

0.72
0.44

x 2 = 1.44
x 2 = 0.88

1
0

0.88
0.76
0.52
0.04

x
x
x
x

2
2
2
2

=
=
=
=

1.76
1.52
1.04
0.08

1
1
1
0

0.08
0.16
0.32
0.64

x
x
x
x

2
2
2
2

=
=
=
=

0.16
0.32
0.64
1.28

0
0
0
1

0.28
0.56
0.12

x 2 = 0.56
x 2 = 1.12
x 2 = 0.24

0
1
0

Znai, binarni zapis razlomakog dijela glasi:


0100 0111 1010 1110 0001 010
Sada moemo zapisati cijeli binarni broj u registar:
P |---E---| |-----------f--------------|
1 0111 1100 0100 0111 1010 1110 0001 010

Kod ovog prikaza postoje i tri posebna sluaja koji oznaavaju neke specijalne vrijednosti.
One su:
1. Ako je E = 0 i svi bitovi mantise su 0, radi se o broju 0
2. Ako je E = 255 i svi bitovi mantise su 0, radi se o ako je bit predznaka 1, a + ako je

bit predznaka 0
3. Ako je E = 255, a bilo koji bit mantise nije 0, onda se radi o NaN (Not a Number)
3.3

PRETVARANJE IZ BINAR NOG ZAPISA U DEKADSKI

Uzmimo za primjer broj 1.125. Njegov binarni zapis vidimo dolje:


0x3F900000 = 00111111 10010000 00000000 00000000
Sign

Exponent

Mantissa

01111111

00100000000000000000000

Iz ovog moemo vidjeti slijedee:


Predznak P = 0
Eksponent E = 127 zbog ega je potencija = 127 = 127 127 = 0
Razlomaki dio f = 0 21 + 0 22 + 1 23 + 0 24 + 0 26 = 0.125
Konaan broj jednak je: 1. 2 = 1.125 20 = 1.125 1 = 1.125

3.4

IEEE 754 PRIKAZ S DVOSTRUKOM PRECIZNOU

Ovdje imamo prikaz broja 32.5, kojeg smo imali u primjeru 1 u prolom potpoglavlju,
zapisanog u 64 bitni registar kao broj s dvostrukom preciznou.
0x4040400000000000 = 01000000 01000000 01000000 00000000
00000000 00000000 00000000 00000000
Sign

Exponent

Mantissa

10000000100

0000010000000000000000000000000000000000000000000000

Moemo vidjeti da za zapis vrijede sva ista pravila kao i dok jednostruke preciznosti, razlika
je jedino u broju bitova potrebnih za zapis pojedinih veliina. Tako predznak i dalje zauzima
1 bit, nakon njega slijedeih 11 bitova slui za zapis eksponenta, te zadnjih 52 bita slui za
zapis razlomakog dijela mantise. Vrijednost eksponenta pri zapisu je = + 1023.

4 ZADACI ZA VJEBU
1. Pretvorite dva sluajna cijela broja u 16-bitni binarni zapis. Jedan treba biti pozitivan,
jedan negativan.
2. Pretvorite dva sluajna realna broja u binarni zapis u 32-bitnom registru za realne
brojeve. Brojevi moraju imati barem 3 decimalna mjesta.
3. Napisati C program koji s tipkovnice uitava 16-bitni binarni broj kao niz znakova (0 i 1) u
znakovno polje. Potrebno je izraunati i na ekran ispisati dekadski zapis uitanog cijelog
binarnog broja.
4. Napisati C program koji s tipkovnice uitava cijeli broj. Potrebno je izraunati i na ekran
ispisati binarni zapis uitanog broja u 32-bitnom registru.
5. Napisati C program koji s tipkovnice uitava realni broj. Potrebno je izraunati i na ekran
ispisati binarni zapis tog realnog broja u 32-bitnom registru.
6. Isti zadatak izvesti s funkcijom BinBr koja rauna i vraa vrijednost binarnog zapisa
realnog broja u 32-bitnom registru.

You might also like