Celá čísla v počítači
V současné době je standardem používat k uložení celého čísla 32 bitů. Protože je to docela dlouhé dvojkové číslo, použijeme pro následující příklad pouze čtyři bity.
Ilustrace
Do čtyřech bitů lze uložit následujících 16 kombinací 0 a 1:
3210 hex unsigned signed
---- - -------- ------
0000 0 0 0
0001 1 1 1
0010 2 2 2
0011 3 3 3
0100 4 4 4
0101 5 5 5
0110 6 6 6
0111 7 7 7
1000 8 8 -8
1001 9 9 -7
1010 A 10 -6
1011 B 11 -5
1100 C 12 -4
1101 D 13 -3
1110 E 14 -2
1111 F 15 -1
Když potřebujeme do 4-bitového čísla uložit číslo s významem celého
čísla se znaménkem máme několik možností. V posledním slupci tabulky je
uveden dnes nejrozšířenější způsob - reprezentace celého čísla se
znaménkem pomocí tzv. dvojkového doplňku. Je to technologicky nejméně
nákladný způsob jak obvody počítače naučit pracovat zárověň s
čísly se znaménkem i bez znaménka. To proto, že stroj nemusí rozlišovat,
zda sčítá či odčítá číslo se znaménkem nebo bez:
Operace 1010+0010 = 1100 má podle okolností buď význam
10 + 2 = 12
a nebo
-6 + 2 = -4.
Protože pomocí 4 bitů můžeme reprezentovat čísla 0..15 resp -8..7 vedou některé operace k tzv. přetečení.
Pro čísla bez znaménka je to např. operace 15+15, jejíž
výsledek neleží v intervalu 0..15.
Pokud se natuto operaci díváme z pohledu operací se znaménkem, je vše
O.K., neboť (-2)+(-2)=-4.
Pro čísla se znaménkem je nedovolená např. operace 4+4=8, neboť jako horní mez rozsahu čtyřbitových oznaménovaných čísel je 7. Z hlediska čísel bez naménka je to ovšem operace dovolená.
Pro nás znamená typ integer 32 bitové číslo se znaménkem povolující
uložení celého čísla v rozsahu –2 147 483 648 ..
2 147 483 647.
V případě, že nějaká oprace, např. v příkazu k:=i*j vede k
přetečení, není obvykle spuštěn žádný poplach a program se posléze chová
podivně bez zjevných příčin, protože výsledek přiřazovacího příkazu je
jiný, než zamýšlený. Je ale možné donutit program, aby si tato možná
přetečení ohlídal, stráví se tím nějaký čas navíc, ale ušetří to čas při
hledání problémů. Až se budeme zabývat laděním programů bude zapnutí
kontroly na přetečení jedním z bodů v návodu.
Ve vyjímečných případech budeme potřebovat vědět, že jsou k dispozici i jiné celočíselné typy:
Identif.Typu Rozsah Formát uložení
-----------------------------------------------
Shortint –128..127 signed 8-bit
Smallint –32768..32767 signed 16-bit
Longint –2147483648..2147483647 signed 32-bit
Int64 –2^63..2^63–1 signed 64-bit
Byte 0..255 unsigned 8-bit
Word 0..65535 unsigned 16-bit
Longword 0..4294967295 unsigned 32-bit
Jak vidíme, typ Integer je v současné době totožný s typem Longint. Je pravděpodobné, že během několika let bude typ Integer odpovídat 64-bitovému číslu a neměli bychom spoléhat na to, že proměnné typu Integer jsou ukládány jako zrovna jako 32-bitové. Abychom však nemuseli hlídat každý součin 200*200 (nevejde se do SmallInt), budeme předpokládat, že těch bitů je nejméně 32, takže pozor na přetečení si budeme muset dávat až u součinů jako je 50000*50000.
S výjimkou typu Int64 obecně neplatí, že operace s kratším formátem
je rychlejší, takže důvody pro použití kratšího formátu čísla musí být v
algoritmu samém, ne jeho optimalizaci. Jednou z výjimek je úspora paměti
při uložení miliónů a miliónů celých čísel v poli (viz dále), převážným
důvodem ale bude respektování formátu vstupních dat: např. komponenty
RGB v bitmapě jsou typu Byte, zvuk v audiosouboru na kompaktním disku
je zase posloupnost dvojic (L,R) oznaménkovaných 16-bitových čísel (
typ SmallInt ).