Professional Documents
Culture Documents
P2 - Osnovni Tipovi U Programskom Jeziku C
P2 - Osnovni Tipovi U Programskom Jeziku C
PROGRAMIRANJE
P2 Osnovni tipovi u
programskom jeziku C
Doc. dr. sc. Marijan Herceg
Doc. dr. sc. Josip Job
2015./2016.
Programski jezik C
- neformalno
Imperativni jezik (nasuprot deklarativnom)
Naredbe se izvravaju redom i u skladu sa znaenjem
mijenjaju stanje programa.
Stanje
Naredbe
Izrazi
Funkcije
Blokovi
SQL:
Python:
Programski jezik C
- neformalno
to je tip
Tip je svojstvo varijable koja odreuje koje vrijednosti
ona moe imati i to se s njom moe raditi.
C jezik je eksplicitno tipiziran jezik -> svakoj varijabli
tip mora biti zadan od strane programera -> prilikom
njene deklaracije
C je statiki tipiziran jezik -> jednom postavljen tip vie
se ne moe mijenjati
Svaka varijabla ima tip, svaki izraz ima tip, (skoro) sve
ima tip
Osnovni tipovi - izvedeni tipovi
Definiran skupom vrijednosti i operacijama
Tip ne mora odreivati fiziku reprezentaciju vrijednosti
char
short (int)
uobiajen opseg -2147483648, 2147483647 ] ako je oznaen ili [0, 4294967295], ako
je neoznaen
long (int)
uobiajen opseg [-32768, 32767] ako je oznaen ili [0, 65535], ako je neoznaen
int
uobiajen raspon [-128, 127] ako je oznaen ili [0, 255], ako je neoznaen
uobiajen opseg -2147483648, 2147483647 ] ako je oznaen ili [0, 4294967295], ako
je neoznaen
Modifikatori
Mogui modifikatori osnovnih tipova:
char
signed
unsigned
int
signed
unsigned
short
long
intmax_t i uintmax_t
Rjeenje za ve postojei
kod
Osnovno rjeenje je preraditi kod
Neki kompajleri, kao to je GCC nude opciju kojom se
odreuje koja e biti podrazumjevana oznaenost char
tipa:
-fsigned-char i -funsigned-char.
Pokazivai
Najbolje je na pokazivae gledati kao na poseban tip.
U tom smislu, zvjezdicu zalijepiti za tip na koji se pokazuje:
int* p;
umjesto:
Pokazivai na objekte:
float* p;
p = &x;
*p = y;
z = *p;
int *p;
Pokazivai na funkcije:
int* (*p)(int a, float b);
int* foo(int x, float y);
p = foo;
ip = p(n, m);
Korisniki tipovi
typedef nasuprot #define
Za definiranje novih tipova moe se koristiti #define i typedef
#define INT_PTR int*
typedef int* int_ptr;
Primjer uporabe:
INT_PTR ptr1, ptr2;
int_ptr ptr3, ptr4;
Primjer: poslije pretprocesora prva linija izgleda ovako
int* ptr1, ptr2;
to tu nije u redu?
Savjet 1: Za nove tipove koristiti typedef.
Savjet 2: Svaka deklaracija varijable u zasebnom redu.
Tip
Znak
Eksponent
Mantisa
Ukupno bita
float
23
32
double
11
52
64
Enum primjer
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
1
2
3
4
5
6
7
Konverzije tipova
Konverzije tipova
Kada se dva razliita tipa kombiniraju u odreenim
operacijama nastaje potreba za konverzijom tipova
Konverzija moe biti:
Implicitna
Dodjela
Poziv funkcije
Prosljeivanje parametara
Povratna vrijednost
Eksplicitna
-37
051
// 41
0x2b
// 43
0xFFFFFFD1 // -47
3.14159
6.02e23
1.6e-19
// 3.14159
// 6.02 x 10^23
// 1.6 x 10^-19
Promocije tipova
Promocija tipova je specijalni sluaj implicitne konverzije.
Promocije cjelobrojnih tipova
Promocije float-ova
Aritmetike konverzije:
primer
double polovina = 1/2;
Koja e biti vrijednost varijable polovina?
Zato?
Kojeg tipa su djeljenik i djelitelj?
Kojeg tipa je kolinik?
Svaki operand, tj. izraz, ima tip pa tako i izraz 1/2
ima tip i taj tip nema veze s tipom operanda s lijeve
strane jednakosti!
Aritmetike konverzije
Brojani tipovi su poredani po rangovima od najmanjeg do najveeg
ovako:
char, short, int, long, long long, float, double, long double
Ukoliko u binarnoj operaciji sudjeluju dva operanda razliitog tipa, onda
se operand iji je tip manjeg ranga konvertira u tip drugog operanda
Ukoliko u binarnoj operaciji tipovi operanada nisu iste oznaenosti,
onda se operand iji je tip oznaen konvertira u neoznaeni tip.
Pouka: biti jako paljiv s ovim!
Najbolje je da osim konverzije iz nekog cjelobrojnog tipa u tip s
pominim zarezom uvijek koristimo eksplicitne konverzije.
Kompajler e obino generirati upozorenja za dio problematinih
sluajeva.
Sigurne konverzije
Konverzije pokazivaa
Konverzije koje ne treba praviti su:
uint8_t p1[4];
uint32_t* p2;
p2 = (uint32_t*)p1; /* incompatibile alignment */
Konverzije pokazivaa
Validne konverzije:
Nevalidne konverzije:
Di najveeg
znaaja se upisuje
prvi = big endian
8bit access: