Professional Documents
Culture Documents
Zagreb, 2006.
Uvod u C-programiranje
osnovni tipovi podataka
ZAGREB, 2006.
1
Treba voditi rač
računa kod deklaracije tipa
podataka!
Primjer u programskom jeziku C
Brojanje
void main () {
short int i;
i = 0;
while (i < 100000) {
i = i + 1;
}
printf ("Gotovo!");
}
Ovaj program neć
neće moć
moći brojiti do 100000 jer je short int i
ogranič
ograničen na 32767.
Binarni brojevi
Kod binarnih brojeva (baza 2), znamenke
imaju samo dvije vrijednosti:
y 0 or 1
Jedan bit čuva dvije različ
različite vrijednosti
Binarni sustav je prirodni nač
način za
pohranu brojeva u predlož
predložak bitova
y Binarni sustav je manje kompaktan za prikaz,
ali je njegova jednostavnost praktič
praktičnija za
elektronič
elektroničku manipulaciju brojeva.
“bit”
bit” znač
znači “binary digit
digit””
2
Vrijednosti pozicija kod brojevnih
sustava
Za binarni broj “10010”
010” (baza 2) to
izgleda ovako
Baza je 2
24 23 22 21 20
× + × + × + × + ×
1 0 0 1 0
Za bazu 2 znamenke
su 0 ili 1
÷2= 31 ost.
ost. 1
÷2= 15 ost.
ost. 1
÷2= 7 ost.
ost. 1
÷2= 3 ost.
ost. 1
÷2= 1 ost.
ost. 1
÷2= 0 ost.
ost. 1
111
11111102
ZAUSTAVI kada ovaj rezultat Čitaj
postane nula odozdo
3
Konverzija u binarni sustav
Drugim riječ
riječima . . . Krajnji desni bit zove se
the least significant bit
(LSB)
12610 = 11011
11011102
Rekapitulacija - konverzije u
binarni sustav
Započ
Započinjemo s dekadskim brojem
kojeg pretvaramo
Ponavljamo:
Ponavljamo:
y Podijelimo broj s 2 i ostatak 0 ili 1
zapiš
zapišemo
y Ponavljamo dok broj ne postane
jednak nuli
Binarni ekvivalent je kompletan
y Čitamo znamenke u obrnutom
redoslijedu od njihovog nastanka tako
da je MSB prvi s lijeva
4
Pretvaranje binarnog broja u
dekadski
27 26 25 24 23 22 21 20
(128) (64) (32)
(32) (16) (8) (4) (2) (1) Vrijednost
pozicije
0 1 1 1 1 0 1 1
Zbrajanje
vrijednosti pozicija za
8 9 8 9 9 8 9 8 koje je binarna
vrijednost 1
64+32+
32+16+ 8 + 2 +1 = 123
Indeks označ
označava
bazu
5
Pozicijske vrijednosti za različ
različite brojevne
sustave
BAZA VRIJEDNOST
2 100101111110
3 10100000 Znamenke s vrijednostima
4 211332 već
većim od 9 označ
označavaju se
5 34210 slovima
6 15130
7 10041
A = (10)
8 4576 B = (11)
9 3300 C = (12)
10 2430 D = (13)
11 190A
12 14A6
E = (14)
13 114C F = (15)
14 C58 Itd.
Itd.
15 AC0
16 97E
BAZA VRIJEDNOST
binarni 2 100101111110
3 10100000
4 211332
5 34210
6 15130
Uobič
Uobičajene baze 7 10041
(brojevni oktalni 8 4576
9 3300
sustava) u dekadski 10 2430
rač
računanju 11 190A
12 14A6
13 114C
14 C58
15 AC0
heksadekadski (“hex”
hex”) 16 97E
6
Razmiš
Razmišljajmo binarno
Dekadski Binarni Hexa
0 = 0000 = 0
1 = 0001 = 1
2 = 0010 = 2
3 = 0011 = 3
4 = 0100 = 4
5 = 0101 = 5
6 = 0110 = 6
7 = 0111 = 7
8 = 1000 = 8
9 = 1001 = 9
10 = 1010 = A
11 = 1011 = B
12 = 1100 = C
13 = 1101 = D
14 = 1110 = E
15 = 1111 = F
27 26 25 24 23 22 21 20
(128) (64) (32) (16) (8) (4) (2) (1)
0 0 0 0 0 0 0 0
8 8 8 8 8 8 8 8
= 0
7
Cjelobrojne vrijednosti bez
predznaka-
predznaka- (Unsigned)
Unsigned)
Najveć
Najveća vrijednost (8 bita
bita)
27 26 25 24 23 22 21 20
(128) (64) (32) (16) (8) (4) (2) (1)
1 1 1 1 1 1 1 1
9 9 9 9 9 9 9 9
128 +64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
8
Cjelobrojne vrijednosti bez
predznaka-
predznaka- (Unsigned)
Unsigned)
C ima unsigned cjelobrojne vrijednosti
različ
različite velič
veličine
8 bita
bita (unsigned char)
char)
y 0 do 255
16 bita
bita (unsigned short)
short)
y 0 do 65 535
32 bita
bita (unsigned long)
long)
y 0 do 4,294,967,295
64 bita
bita (unsigned long long)
long)
y 0 do18
do18,446,744,073,709,551,615
int mož
može biti short ili long
y Zavisi od rač
računala i prevoditelja
Cjelobrojne vrijednosti s
predznakom - (Signed)
Cjelobrojne vrijednosti s
predznakom - (Signed)
Potrebno je rezervirati jedan bit
intigera za predznak
Jednostavna tehnika za predznak
vrijednosti
y MSB = 0: broj je pozitivan
y MSB = 1: broj je negativan
0 0 0 0 1 1 1 0 = +14
sign 1 0 0 0 1 1 1 0 = –14
bit
9
Cjelobrojne vrijednosti s
predznakom - (Signed)
Najmanja vrijednost (8 bita
bita)
–27 26 25 24 23 22 21 20
Ovi bitovi ne
(–128) (64) (32) (16) (8) (4) (2) (1) predstavljaju
128 kao kod
unsigned
1 0 0 0 0 0 0 0 prikaza
intigera.
intigera.
9 8 8 8 8 8 8 8
–128 = –128
Cjelobrojne vrijednosti s
predznakom - (Signed)
Najveć
Najveća vrijednost (8 bita
bita)
–27 26 25 24 23 22 21 20
Ovi bitovi
(–128) (64) (32) (16) (8) (4) (2) (1) perdstavljaju
+127 kao i
kod unsigned
0 1 1 1 1 1 1 1 prikaza
integera.
integera.
8 9 9 9 9 9 9 9
64 + 32 + 16 + 8 + 4 + 2 + 1 = +127
Cjelobrojne vrijednosti s
predznakom - (Signed)
8-bitni
bitni binarni broj
y Najmanja prikazana vrijednost je –128
y Najveć
Najveća prikazana vrijednost je +127
y Sve ostale vrijednosti između te dvije,
dvije, postoje.
y Ostale vrijednost ne postoje.
Pozitivna vrijednost <= 127 koristi
isti 8-bitni
bitni predlož
predložak kao i kod
unsigned ekvivalenta
10
Cjelobrojne vrijednosti s
predznakom - (Signed)
Dvije moguć
moguće interpretacije 8-bitnih
bitnih
vrijednosti Binarna Signed dekadska Unsigned dekadska
vrijednost vrijednosti vrijednosti
Kod n-bitnog
bitnog binarnog broja
y –x prikazujemo binarnim kodom s 2n – x
• Npr.
Npr. Prikaz broja –2 s bin.
bin. Kodom je 28 –2
= 254
To se naziva drugi komplement cijelog
broja s predznakom
Broj se prikazuje kao komplement
potencije broja dva
Opseg vrijednosti je od –2n-1 do +2n-1 –1
11
Cjelobrojne vrijednosti s predznakom -
(Signed)
Svojstva drugog komplementa
y MSB ima negativno vrijednosno mjesto (od -2n-1)
y niž
niži bitovi imaju normalno (+ve
(+ve)) vrijednosno
mjesto
y pozitivni brojevi (uključ
uključujuć
ujući nulu)
nulu)
• moraju imati MSB = 0 )
• Nulta vrijednost – svi bitovi su 0
• Predlož
Predložak bitova je isti kao i kod unsigned
vrijednosti
y negativni brojevi
• Moraju imati MSB =1
• Min vrijednost =100…
100…00, 00, max vrijednost =
111…
111…11 = -110
÷2= 4 ost.
ost. 0
dodajemo 0
je
do 8 bita
÷2= 2 ost.
ost. 0
gore i
pozitivan:
pozitivan :
MSB = 0
÷2= 1 ost.
ost. 0
÷2= 0 ost.
ost. 1
stop
÷2= 13 ost 1
Čitamo
12
Cjelobrojne vrijednosti s predznakom -
(Signed)
11011101
odgovor:
odgovor:
11011101 Rezultat je
negativan:
negativan: MSB = 1
Cjelobrojne vrijednosti s
predznakom - (Signed) : iz
binarnih
Koju vrijednost ima 8-bitni
bitni drugi
komplement od 011001
01100111?
y MSB = 0, pozitivan
y Samo pretvaramo iz binarnog u dekadski kao
i za unsigned
–27 26 25 24 23 22 21 20
(–128) (64) (32) (16) (8) (4) (2) (1)
0 1 1 0 0 1 1 1
8 9 9 8 8 9 9 9
64 + 32 + 4 + 2 + 1 = +103
–27 26 25 24 23 22 21 20
(–128) (64) (32) (16) (8) (4) (2) (1)
1 1 0 0 0 1 0 0
9 9 8 8 8 9 8 8
–128+64 + 4 = –60
13
Cjelobrojne vrijednosti s predznakom -
(Signed) : iz binarnih
Koju vrijednost ima 8-bitni
bitni drugi
komplement od 11000100?
y Negiramo taj –ve binarni broj u +ve ekvivalent,
ekvivalent,
pretvorimo u dekadski,
dekadski, negiramo decimalni
ekvivalent
11000100 dodamo 1
flip
bitova 00111011
odgovor:
odgovor:
+1
Pretvaramo iz –6010
binarnog u dekadski
+6010 00111100
konač
konačno,
no, negiramo dekadsku
vrijednost
Oktalni i binarni
010100
010100111
111100
1002
Grupiranje po tri
bita “triplets”
triplets”
2 4 7 48
14
Heksadekadski
Heksadekadski brojevni
sustav
Baza sustava je B = 16,
16, a znamenke
su 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
y Koristi se za skrać
skraćeno zapisivanje
binarnog sadrž
sadržaja.
aja.
y Zapis se mož
može dobiti iz dekadskog
sukcesivnim dijeljenjem s 16 i
zapisivanjemo ostataka s desna na
lijevo, ali i direktno iz binarnog zapisa
Primjer:
Primjer:
16-
16-bitni broj 0111 1011 0011 1110
heksadekadski
heksadekadski ekvivalent
ekvivalent 7 B 3 E
Hex u binarni
5FE116
ispisujemo 4-
bitne
bitne binarne
ekvivalente za
svaku hex
znamenku
15
Binarni u hex
Dopunimo
ispred s
nulama tako da
mož
možemo
grupirati
0 101001111002
znamenke po
četiri
Grupiramo znakove
u grupe od četiri
znaka (“quartets”
quartets”) s
napiš
napišemo hex desna na lijevo
ekvivalent za
svaku binarnu
četvorku
5 3 C16
Programske baze u C
U C-
C-u ne piš
pišemo direktno znamenke u
binarnom kodu
Hex broj u C-
C-u piš
pišemo s prefiksom 0x
(nula,
nula, slovo x)
y 0x53c (1340 dekadski)
dekadski)
y A do F mogu biti manje ili već
veće
Oktalni broj u C-
C-u piš
pišemo s prefiksom 0
(nula)
nula)
y 02474 (1340 dekadski)
dekadski)
Dekadski broj piš
pišemo direktno
y 1340
y Interno se svi pospremaju u binarnom kodu
Adresiranje cjelobrojnim
unsigned brojevima
16
Adresiranje memorije
Za referiranje na bajt,
bajt, moramo ga
moć
moći razlikovati od ostalih bajtova
Adresiranje:
Adresiranje: analogija
NA
ULICA PRODAJU
MEMORIJE
41 42 43 je na 44
prodaju
Adresiranje memorije
Svaka memorijska lokacija ima jedinstvenu
adresu
y Adresa je uvijek integer (cjelobrojni) podatak
y Ne postoje dvije memorijske lokacije s istom
adresom
Adrese su sekvencijalne (jedna iza druge)
y najniž
najniža adresa 0
y najviš
najviša adresa zavisi od kapaciteta memorije
rač
računala
Lokacija adrese je nezavisna od njenog
sadrž
sadržaja
y Promjene sadrž
sadržaja neke memorijske lokacije
neć
neće poniš
poništiti njezinu adresu
17
Adresiranje memorije
Najniž
Najniža
adresa
0 11011110 Adrese od 1 do
10,429 su ispuš
ispuštene
radi prikaza na
dijagramu
10430 01101110
Rač
Računalo ima
10431 01011010 16,777,216 bajta (16
megabajta
megabajta)) memorije
10432 00000000
10433 01011010 Adrese od 10,435 do
16,777,214 su
Najviš
Najviša 10434 11010011 ispuš
ispuštene radi prikaza
adresa na dijagramu
16777215 11011001
Adresiranje memorije
Najniž
Najniža
adresa 0 11011110
10430 01101110
10431 01011010 Bajt (byte
(byte)) na
10432 00000000 adresi 10434
10434
sadrž
sadrži
10433 01011010
11010011
10434 11010011
Najviš
Najviša
adresa
16777215 11011001
Cjelobrojne konstante
Konstante u C-
C-u pisane u dekadskoj notaciji:
notaciji:
7 20 64 -110 8092 65535
34567821
34567821L -17698794l (na starim
prevodiocima)
18
Prikaz realnih brojeva u rač
računalu
• 3.141592653589793238462643383279502884197169 ≠ π
• 0.333333333333333333333333333333333333333333 ≠ ⅓
ne postoji nač
način na koji bi se u rač
računalu mogao pohraniti
svaki realni broj. Pohranjuju se približ
približne vrijednosti realnih
brojeva.
brojeva.
Primjer de
definicije varijabli
varijabli u programskom jeziku C:
float x;
double y;
long double z;
float
double
long
Pretvaranje
retvaranje decimalnog broja iz dekadsko
dekadskog
g
u binarni brojevni sustav
.25 * 2 1.0 1
0.50
.5 * 2
1.0
19
Množ
Množenje s 2n i 2-n
Kako, međutim
međutim,, u registar pohraniti toč
točku?
Znanstvena notacija
U C, izraz: 12.456e-2
znači: 12.456 × 10-2
20
Znanstvena notacija
Standardni nač
način alokacije 32 bita
bita (IEEE Standard
754) je:
• 23 bita
bita za mantisu
• 1 bit za predznak mantise
• 8 bita za eksponent
31 30 23 22 0
21
Realni
ealni brojevi
brojevi standardne preciznosti
31 30 23 22 0
P Karakteristika Mantisa
• 23 bita
bita za mantisu
• 1 bit za predznak mantise
• 8 bita za eksponent
31 30 23 22 0
• 23 bita
bita za mantisu
• 1 bit za predznak mantise
• 8 bita za eksponent
31 30 23 22 0
22
Prikaz realnog broja (nast.
nast.)
• 23 bita
bita za mantisu
• 1 bit za predznak mantise
• 8 bita za eksponent
31 30 23 22 0
Prikaz mantise
Mantisa je u rasponu
1 ≤ mantisa < baza
baza
Tako
• Ako imam bazu 2, znamenka ispred toč
točke mora biti 1
• I stoga se mi ne moramo brinuti za njezinu pohranu
te tako imamo 24 bitnu
bitnu preciznost uporabom 23 bita
bita
Prikaz mantise
24 bitna
bitna preciznost je ekvivalentna broju od
najmanje 7 decimalnih
decimalnih znamenki :
24
≈ 7.2
log 2 10
23
Prikaz mantise
Trebamo li pohraniti π:
3.1415926535897932384626433832795.....
To znač
znači da ga mož
možemo pohraniti samo na sljedeć
sljedeći nač
način:
3.141592 (odrež
odrežemo)
emo)
3.141593 (zaokruž
zaokružimo)
imo)
Prikaz eksponenta
Prikaz eksponenta
24
Primjer prikaza broja
01011011 (8-
(8-bitni
bitni stroj)
stroj) ?
0 101 1011
sign exp mantissa
Mantisa:
Mantisa: 1.1011
Eksponent
ksponent (excess-
(excess-3 format): 5-3=2
1.1011 × 22 ⇒ 110.11
110.112 = 22 + 21 + 2-1 + 2-2
= 4 + 2 + 0.5 + 0.25 = 6.75
1 10000010 01001100000000000000000
Primjer:
Primjer: Prikazati broj 5.75 kao realni broj
1. Realni dekadski broj prikazati u obliku realnog binarnog broja
5.7510 = 101.112
2. Odrediti predznak: broj je pozitivan, stoga je P = 0
3. Normalizirati binarni broj
101.112·20 = 1.01112·22
4. Izračunati karakteristiku i izraziti ju u binarnom obliku
K = 210 + 12710 = 12910 = 1000 00012
5. Izbaciti vodeću jedinicu iz mantise (skriveni bit)
Mantisa (bez skrivenog bita i decimalne toč
točke)
ke) = 01
01112
6. Prepisati predznak, karakteristiku i mantisu bez skrivenog bita u registar
0 10000001 01110000000000000000000
P Karakteristika Mantisa
0100 0000 1011 1000 0000 0000 0000 00002
4 0 B 8 0 0 0 0 16
25
Raspon i preciznost realnih brojeva
standardne preciznosti
Najveć
Najveći pozitivni broj koji se mož
može prikazati je:
je:
Posebni sluč
slučajevi
• Kada je K = 0 i svi bitovi mantise su nula radi se o broju nula
• Kada je K = 0 i postoje bitovi mantise koji nisu 0, tada se radi o
denormaliziranom broju
• Kada je K = 2047 i svi bitovi mantise su 0 radi se o +∞
+∞ ili -∞
• Kada je K = 2047 i postoje bitovi mantise koji nisu 0, tada se ne
radi o prikazu broja (NaN)
26
Raspon i preciznost realnih brojeva
dvostruke preciznosti
Najveć
Najveći pozitivni broj koji se mož
može prikazati je:
je:
PRIMJER
Zadan je binarni decimalni broj kao mini float (10 bita). Prikazati ga u
obliku
Predznak (normalizirana binarna mantisa) x 2(decimalni exponent)
Pretvori broj u dekadski ekvivalent.
1 1010 11001
Rješenje:
Bit predznaka = 1 - radi se o negativnom broju
PRIMJER
0 10001110 10100000000000000000000
Rješ
Rješenje: To je C 32-
32-bit float format.
Bit predznaka = 0 - radi se o pozitivnom broju
Uključ
Uključivš
ivši skriveni bit 1 u mantisi normalizirana mantisa ima oblik :
1.110100000000000000000000 x 215
27
PRIMJER
1 01111000 01110000000000000000000
Rješ
Rješenje: To je C 32-
32-bit float format.
Bit predznaka = 1 - radi se o negativnom broju
Uključ
Uključivš
ivši skriveni bit 1 u mantisi normalizirana mantisa ima oblik :
-1.01110000000000000000000 x 2-7
PRIMJER
0 10000001000 000001010000000000000000000000000000000
0000000000000
Rješ
Rješenje: To je C “double”
double” 64-
64-bit float format.
Bit predznaka = 0 - radi se o pozitivnom broju
Uključ
Uključivš
ivši skriveni bit 1 u mantisi normalizirana mantisa ima oblik :
+1.0000010100000000000000000000000000000000000000000000 x 29
PRIMJER
Pretvori dekadsku vrijednost u binarni float format duljine 10 bita ( 1 bit za predznak 4 bita
za karakteristiku i 5 bita za mantisu) :
-6.7 kao "mini-float".
» Rješenje: Kako je broj negativan Bit predznaka = 1.
Cijeli dio broja 6 u binarnom obliku je 110.
Sada pretvorimo 0.7 u binarni decimalni dio:
2 x 0.70 = 0.40 + 1
2 x 0.40 = 0.80 + 0
2 x 0.80 = 0.60 + 1
2 x 0.60 = 0.20 + 1
2 x 0.20 = 0.40 + 0
tako da je 0.7 = 0.101102 za 5-bitnu preciznost
-6.710 = - 110.10110 = - 1.1010110 x 22 u normaliziranom obliku
BE =2. K = BE + 7 = 2 + 7 = 9 = 10012
Kombiniramo bit predznaka = 1, Karakteristiku = 1001, i mantisu = 10101 (bez
skrivenog bita 1) daje :
1 1001 10101 kao mini float's reprezentacija broja -6.7
28
Realne konstante
1. 2.34 9e-
9e-8 8.345e+25 double
2f 2.34F -1.34e5f float
1.L 2.34L -2.5e-
2.5e-37L long double
29