1. Sissejuhatus
Andmetüüpide olulisus C keeles
C keel on üks parimaid keeli tõhusate programmide loomiseks. Selle efektiivsuse võti on andmetüüpide mõistmine ja nende õige kasutamine. Andmetüübid määravad, millist tüüpi ja millises vahemikus väärtusi saab muutujatesse salvestada, ning on otseselt seotud mälu efektiivse kasutamisega. Selles artiklis selgitatakse C keele andmetüüpide põhialuseid ja üksikasju, aidates arendajatel valida kõige sobivama andmetüübi.
Artikli eesmärk
Selle artikli eesmärk on anda põhiteadmisi C keele andmetüüpide kohta ning selgitada nende kasutamist ja erinevusi keskkondade lõikes. Samuti käsitletakse parimaid praktikaid ja olulisi tähelepanekuid, et toetada õiget otsustamist andmetüüpide valikul.
2. C keele põhilised andmetüübid
2.1 Täisarvulised tüübid (int
, short
, long
, long long
)
C keeles on olemas täisarvulised andmetüübid nagu int
, short
, long
ja long long
. Nende tüüpide vahemik ja maht on erinevad. Näiteks int
on tavaliselt 4 baiti ning talletab väärtusi vahemikus -2147483648 kuni 2147483647, kuid see võib sõltuvalt platvormist varieeruda.
short
: Tavaliselt 2 baiti, väärtused -32768 kuni 32767long
: Tavaliselt 4 baiti, väärtused -2147483648 kuni 2147483647long long
: Tavaliselt 8 baiti, väärtused -9223372036854775808 kuni 9223372036854775807
2.2 Ujukomaarvud (float
, double
, long double
)
Ujukomaarvude tüüpe kasutatakse väärtuste jaoks, mis sisaldavad kümnendkohti. C keeles on kolm ujukomaarvu tüüpi: float
, double
ja long double
.
float
: Ühekordse täpsusega ujukomaarv, 4 baiti. Saab talletada väga väikseid ja suuri arve.double
: Kahekordse täpsusega ujukomaarv, suurem täpsus kuifloat
ja 8 baiti.long double
: Veelgi suurema täpsusega ujukomaarv, tavaliselt üle 8 baiti.
2.3 Märgitüüp (char
)
char
tüüpi kasutatakse märkide salvestamiseks, kuid see toimib tegelikult ühebaidise täisarvuna. Tavaliselt talletab char
väärtusi vahemikus -128 kuni 127, kuid seda saab deklareerida ka allkirjastatuna või allkirjastamata.
2.4 Keskkonna- ja kompilaatorisõltuvus
C keele andmetüüpide suurus ja vahemik sõltuvad kasutatavast keskkonnast ja kompilaatorist. Seetõttu tuleb erinevates keskkondades programme käivitades arvestada, et andmetüüpide suurus ja vahemik võivad olla erinevad.
3. Andmetüüpide üksikasjad
3.1 Täisarvuliste tüüpide üksikasjad
C keeles on täisarvulistel andmetüüpidel nii allkirjastatud kui ka allkirjastamata versioonid. int
ja short
on vaikimisi allkirjastatud, kuid unsigned
märksõna abil saab määrata allkirjastamata tüübi.
unsigned int
: Väärtused vahemikus 0 kuni 4294967295unsigned short
: Väärtused vahemikus 0 kuni 65535unsigned long
: Väärtused vahemikus 0 kuni 4294967295
3.2 short
ja long
kasutamine ning tähelepanekud
short
märksõna annab tavaliselt poole väiksema täisarvulise tüübi kui tavaline int
. Näiteks short int
on tavaliselt 2 baiti. long
märksõna lisamine ei pruugi tüübi mahtu muuta, kuid long long
topeltab tavaliselt täisarvulise tüübi mahu.
3.3 signed
ja unsigned
erinevus
signed
märksõnaga saab salvestada negatiivseid väärtusi. unsigned
märksõna korral negatiivseid väärtusi ei talletata, kuid positiivsete väärtuste vahemik on suurem. Näiteks unsigned int
võimaldab salvestada väärtusi 0 kuni 4294967295.
3.4 Andmetüübi suuruse kontroll sizeof
operaatoriga
C keeles saab sizeof
operaatori abil kontrollida andmetüübi mahtu baitides. Näiteks sizeof(int)
tagastab int
tüübi baitide arvu. See on eriti kasulik andmetüüpide suuruse kontrollimiseks erinevates keskkondades.
#include <stdio.h>
int main(void){
printf("char : %d\n", sizeof(char));
printf("int : %d\n", sizeof(int));
printf("long int : %d\n", sizeof(long int));
printf("float : %d\n", sizeof(float));
printf("double : %d\n", sizeof(double));
return 0;
}
4. Andmemudelid ja keskkonna erinevused
4.1 Andmemudelid (LLP64, LP64 jne)
C keele andmetüübid järgivad platvormi ja kompilaatori järgi erinevaid andmemudeleid. Levinumad mudelid on LLP64 ja LP64.
- LLP64: Mudel, mida kasutatakse Windowsi 64-bitistes keskkondades.
int
on 32 bitti,long
on 32 bitti,long long
on 64 bitti. - LP64: Mudel, mida kasutatakse Unixil põhinevates (Linux, macOS) 64-bitistes keskkondades.
int
on 32 bitti,long
jalong long
on 64 bitti.
4.2 OS-i keskkondade erinevused tüüpide suuruses
Windowsi ja Unixi keskkondades võivad sama nimega andmetüüpide mahud olla erinevad. Näiteks Windowsi 64-bitises keskkonnas on long
4 baiti, kuid Unixi 64-bitises keskkonnas 8 baiti. Selle erinevuse mõistmine on oluline ristplatvormilise arenduse puhul.
4.3 Erinevused 32-bitistes ja 64-bitistes keskkondades
32- ja 64-bitiste keskkondade vahel on andmetüüpide maht ja vahemik erinevad. 64-bitises keskkonnas saab kasutada suuremat mälumahtu ning long
ja long long
suudavad talletada suuremaid väärtusi.
5. Praktilised näited ja tähelepanekud
5.1 Tähelepanekud andmetüübi valikul
Andmetüübi valimisel tuleb arvestada talletatavate väärtuste vahemikku ja mälutõhusust. Kui negatiivseid väärtusi pole vaja, siis unsigned
tüübi kasutamine võimaldab talletada suuremaid positiivseid väärtusi.
5.2 Andmetüübi valik mälutõhususe ja jõudluse seisukohalt
Suurte andmete töötlemisel saab õigete andmetüüpide valikuga parandada mälutõhusust. Näiteks short
tüübi kasutamine säästab mälu võrreldes int
-ga, kuid vähendab salvestatavate väärtuste vahemikku.
5.3 char
tüübi allkirjastatuse kontroll
Et kontrollida, kas char
tüüp on allkirjastatud või mitte, võib kasutada päist limits.h
ja makrot CHAR_MIN
. Mõned kompilaatorid võimaldavad kasutada makrot __CHAR_UNSIGNED__
allkirja tuvastamiseks.
#include <stdio.h>
#include <limits.h>
int main(void){
if (CHAR_MIN < 0) {
printf("char tüüp on allkirjastatud\n");
} else {
printf("char tüüp on allkirjastamata\n");
}
return 0;
}
5.4 Praktilised näited programmis ja nende väljund
Järgmisena selgitatakse andmetüüpide praktilist kasutust programmis ja selle väljundit. Allolev kood deklareerib mitmesuguseid muutujaid ja kuvab nende suuruse ning väärtuse.
#include <stdio.h>
int main(void) {
char c = 'A';
int i = 100;
long l = 1000L;
float f = 3.14f;
double d = 3.14159;
printf("char väärtus: %c, suurus: %d baiti\n", c, sizeof(c));
printf("int väärtus: %d, suurus: %d baiti\n", i, sizeof(i));
printf("long väärtus: %ld, suurus: %d baiti\n", l, sizeof(l));
printf("float väärtus: %f, suurus: %d baiti\n", f, sizeof(f));
printf("double väärtus: %lf, suurus: %d baiti\n", d, sizeof(d));
return 0;
}
6. Parimad praktikad
6.1 Andmetüübi valiku parimad praktikad
Parim lähenemine andmetüübi valikul on valida sobiv tüüp vastavalt väärtuste vahemikule ja eesmärgile. Kui väärtused on alati positiivsed, kasuta unsigned
tüüpe, et parandada mälukasutust. Kui on vaja kümnendkohtade täpsust, kasuta float
või double
tüüpe.
6.2 Andmetüüpide õige kasutamine arenduskeskkonnas
On oluline mõista, et andmetüüpide suurus võib arenduskeskkonniti erineda. Ristplatvormilise arenduse korral on soovitatav kasutada fikseeritud suurusega tüüpe nagu int32_t
või int64_t
, mis aitavad vältida andmetüübi suuruse erinevusi erinevates keskkondades.
6.3 Levinumad vead andmetüüpide kasutamisel ja nende vältimine
Üks levinumaid vigu on andmetüüpide suuruse ja vahemiku valesti hindamine. Näiteks kui suur väärtus salvestatakse int
tüüpi, võib tekkida ületäitumine ja ootamatu tulemus. Selliste vigade vältimiseks kasuta long long
või kontrolli tüübi suurust sizeof
abil.
7. Kokkuvõte
C keeles on andmetüüpide mõistmine tõhusa ja turvalise programmi loomise seisukohalt hädavajalik. Mõistes iga andmetüübi mahtu ja vahemikku ning pöörates tähelepanu keskkonnast tulenevatele erinevustele, saab vältida ootamatut käitumist ja optimeerida mälukasutust. Parimaid praktikaid järgides saab valida sobiva andmetüübi ja parandada koodi loetavust ning teisaldatavust.
Selles artiklis käsitleti C keele põhilisi andmetüüpe, detailset kasutust ja parimaid tavasid. Rakenda neid teadmisi, et saavutada praktiline ja tõhus programmeerimine.