Täisarvud

Täisarvud baseeruvad kõik tüübil integer (int). Arvutis kasutatavad täisarvud erinevad teataval määral matemaatikast tuntud täisarvudest. Matemaatikas on täisarvude hulk loenduv, kuid lõpmata suur. Igale täisarvule võib leida uue täisarvu, mis on temast ühe võrra suurem või väiksem. Arvutis kasutatavate täisarvude hulk on aga piiratud, kuna iga arvu jaoks on ette nähtud vaid teatud kindel hulk baite. Seepärast suudab üks muutuja tüübist integer salvestada väärtusi vaid kindlast täisarvude osahulgast. Nii on loodud hulk tüübi integer alamtüüpe, mis suudavad salvestada suuremaid või väiksemaid arve. Järgnevas tabelis näete tüübi integer alamtüüpe koos vastavate nimede, vajalike baitide arvu ja võimalike väärtuste piirkonnaga.


Tüübi nimed Suurus baitides Väärtuste piirkond
int 2 -32 768 kuni 32 767
unsigned int ehk unsigned 2 0 kuni 65 535
short int ehk short 2 -32 768 kuni 32 767
unsigned short int ehk unsigned short 2 0 kuni 65 535
long int ehk long 4 - 2 147 483 648 kuni 2 147 483 647
unsigned long int ehk unsigned long 4 0 kuni 4 294 967 295

Tabel 3: Täisarvude tüübid

Tabelis 4 lähtutakse oletusest, et te kasutate Intel 80286 tüüpi protsessoriga arvutit. Teistsuguse protsessoriga arvutitel on need andmetüübid küll olemas, kuid nende suurused ja seega ka võimalike väärtuste piirkonnad võivad toodud andmetest erineda. Näiteks i80386 tüüpi protsessoriga arvutitel on tüübi int suuruseks 4 baiti.

Tüüp int on defineeritud nii, et ta reserveerib antud arvutil sobivaima suurusega mälupesa. Intel 80286 tüüpi protsessoriga arvutid on 16-bitised, s.o. nende andme- ja aadressisiin on 16 biti laiused. Seega suudavad nad korraga toimetada mälust protsessorisse 16 bitti. Neljabaidise andmehulga jaoks on vaja andmeid transportida kahes jaos. Kui nüüd andmesegmendis on enne 16-bitist int tüüpi muutujat salvestatud üks ühebaidine muutuja ja sellele järgnev int algab seepärast paarituarvuliselt aadressilt, siis tuleb see toimetada protsessorisse hoolimata oma sobivast suurusest ikkagi kahes jaos. See on tingitud Intel protsessorite ehitusest. Probleemi lahendamiseks kasutatakse sageli nn. align käsku, mis sunnib translaatori salvestama suuremaid andmetüüpe alustades paarisarvuliselt aadressilt. Vajaduse korral jäetakse muutujate vahele lihtsalt tühje kohti. Borland C translaatori puhul kasutage sel puhul menüü Options | Compiler | Code Generation dialoogis valikut Word alignment.

Andmetüübi suuruse hankimiseks baitides kasutage operaatorit sizeof(). Näiteks:

i = sizeof(int)	/* mis peaks olema 2 */

Need väärtused on erinevatel arvutitel erinevad. Kindel on vaid see, et:

sizeof(short) <= sizeof(int) <= sizeof(long), ning
sizeof(unsigned short) <= sizeof(unsigned) <= sizeof(unsigned long)

Täisarvude piirkonna piiratusest tuleneb see, et lisades suurimale täisarvule ühe on tulemuseks vastava tüübi väikseim arv. Näiteks:

int	i;
...
i = 32767;   /* = sümboolne konstant INT_MAX --> LIMITS.H */
i = i + 1;   /* i on nüüd - 32 768, mitte +32 768 !!! */

Seda viga nimetatakse piiri ületamiseks (owerflow). Osa translaatoreid väljastab vastaval juhul veateate, osa vaid siis, kui seda otse nõutakse (vastava translaatori käsuga) ja osa üldse mitte. Siin tuleks kasutada päisefailis LIMITS.H defineeritud sümboolseid konstante ja ise kontrollida, et piiri ei ületataks.