Pri ukladaní celého čísla do pamäte sa môžeme rozhodnúť, či použijeme 1 byte, 2 byty, 4 byty alebo viac.
Dátový typ určitej veľkosti je schopný reprezentovať len toľko čísel, koľko mu veľkosť pamäte umožňuje. Pri pokuse pamätať si väčšie číslo dochádza k chybnej aritmetike, alebo ku strate najdbytočných bitov, voláme to pretečenie.
Príklad chybnej aritmetiky: V premennej veľkosti 1 byte so znamienkom máme uložené číslo 127 = 01111111. Chceme pričítať číslo 1. V dvojkovej sústave to bude 10000000, avšak podľa rôznych reprezentácií to môže byť v desiatkovej sústave číslo -0, -127, -128, +0.
Ukážka v jazyku Pascal: | Ukážka v jazyku C: |
---|---|
Program CeleCislo; var a:shortint; begin a := 127; a := a+1; writeln(a); end. |
#include int main() { short int a = 32767; a=a+1; printf(„%d\n“,a); return 0; } |
Príklad pretečenia: V premennej veľkosti 1 byte bez znamienka máme uložené číslo 255 = 11111111. Chceme pričítať číslo 1. V dvojkovej sústave to bude 1 00000000, pričom tú prvú jednotku strácame, v premennej ostáva len osem núl, výsledok je 0.
Ku strate ľavých bitov dochádza aj pri konverzii väčšieho typu na menší – vtedy sa z pôvodnej hodnoty skopíruje príslušný počet najnižších bitov do cieľovej hodnoty, a zvyšné bity sa jednoducho vynechajú. Ak je veľkosť pôvodného čísla v rozsahu cieľového typu, číslo zostane rovnaké. Ak je mimo tohto rozsahu, vynechaním bitov sa zmení jeho hodnota, môže dôjsť aj k zmene znamienka, z kladného čísla na záporné alebo zo záporného na kladné.
(V opačnom prípade, pri konverzii s menšieho typu na väčší sa jednoducho pridajú naľavo nuly.)
Príklad konverzie: číslo 2000 sa do 4 bytovej premennej uloží ako bity 00000000 00000000 00000111 11010000. Pri konverzii na 2 bytový typ zostanú bity 00000111 11010000, ktoré stále kódujú hodnotu 2000. Pri konverzii na 1 bytový typ však zostanú iba bity 11010000, ktoré kódujú hodnotu -48.
Ukážka v jazyku Pascal: | Ukážka v jazyku C: |
---|---|
Program CeleCislo; var a:longint; var b:integer; var c:shortint; begin a := 2000; b := a; c := b; writeln(a); writeln(b); writeln(c); end. |
#include int main() { long int a = 2000; short int b = a; char c = b; printf(„%d\n“,a); printf(„%d\n“,b); printf(„%d\n“,c); return 0; } |
Ukážkové zdrojové kódy si môžete nakopírovať do niektorého online kompilátora, napríklad
https://www.tutorialspoint.com/compile_pascal_online.php
https://www.tutorialspoint.com/compile_c_online.php
Vyskúšaj sa, ako zvládaš používanie celých čísel v jazyku C. Otestuj sa v krátkom kvíze.