Pri ukladaní celého čísla do pamäte sa môžeme rozhodnúť, či použijeme 1 byte, 2 byty, 4 byty alebo viac. Čím viac pamäťových bytov použijeme, tým väčšie číslo si môžeme zapamätať. Pomenovanie a definícia typov celočíselných premenných sa môže meniť podľa architektúry a jazyka.
Najmenšia pamäťová jednotka, ktorú môžeme použiť na pamätanie si čísla je byte, čo je 8 bitov, teda 28 = 256 rôznych môžností. Môžeme sa rozhodnúť, či v rámci týchto možností, si budeme pamätať čísla 1..256 alebo 0..255 alebo -127..128 alebo -128..127 alebo 7…262 🙂
Nuž ale nerozhodujeme sa vlastne my sami, ale tí, čo vyrábajú počítače. Vymysleli, že budú 2 možnosti:
- Bez znamienka (unsigned) 0..255
- So znamienkom (signed) -127..127 alebo -128..127
Bez znamienka je to jednoduché, tam niet čo vymýšľať. Jednoducho číslo je reprezentované v dvojkovej sústave. Napr. 00000110 = 6
So znamienkom je to už trochu ťažšie vymyslieť. Ako budeme reprezentovať záporné čísla, napríklad mínus 6? Rôzne múdre hlavičky vymysleli rôzne riešenia:
Prvý bit je znamienko
Ak je najľavejší bit 0, je to kladné číslo, ak je 1, tak je to záporné číslo. Zvyšných 7 bitov je číslo reprezentované v dvojkovej sústave. Napr. 10000110 = -6
Najväčšie číslo: 01111111 = +27-1 = +127
Nula: 00000000 = +0
Nula: 10000000 = -0
Najmenšie číslo: 11111111 = -27-1 = -127
Komplement – záporné číslo sú opačné bity
Kladné čísla sú reprezentované siedmymi bitmy v dvojkovej sústave, záporné čísla sú všetkých osem bitov prehodených na opačné (komplementárne, negované). Napr.
11111001 = -6
Najväčšie číslo: 01111111 = +27-1 = +127
Nula: 00000000 = +0
Nula: 11111111 = -0
Najmenšie číslo: 10000000 = -127
Zväčšený komplement – záporné číslo sú opačné bity plus jedna
Kladné čísla sú reprezentované siedmymi bitmy v dvojkovej sústave, záporné čísla sú všetkých osem bitov prehodených na opačné a pričítaná jednotka.
Najväčšie číslo: 01111111 = +27-1 = +127
Jednotka: 00000001 = +20 = 1
Nula: 00000000 = 0
Mínus jedna: 11111110 + 1 = 11111111 = -1
Druhé najmenšie číslo: 10000000 + 1 = 1000001= -127
Najmenšie číslo: 10000000 = zvýšilo nepoužité, môže byť -128
Posun nuly
Usporiadajme všetky 8-bitové čísla v dvojkovej sústave od najmenšieho po najväčšie. Najmenšiemu priraďme najnižšiu hodnotu, ktorú chceme reprezentovať a najväčšiemu najvyššiu hodnotu. Nula sa tak v dvojkovej rteprezentácii dostane niekam do stredu.
Najväčšie číslo: 11111111 = +127
Nula: 10000000 = 0
Najmenšie číslo: 00000000 = -128
Mocnicnový základ mínus 2
Doteraz sme vždy uvažovali dvojkovú sústavu so základom 2. Skúsme si teraz vypočítať, aké čísla budú vychádzať, ak použijeme základ (-2):
00000000 = +0 = -0
00000001 = (-2)0 = 1
00000010 = (-2)1 = -2
00000011 = (-2)1 + (-2)0= -2+1 = -1
Počet bytov pamäte | Používa sa najľavejší bit na reprezentáciu znamienka +-? | Počet bitov pamäte reprezentujúcich číslo | Najmenšie číslo | Najväčšie číslo | Pomenovanie v jazyku Pascal | Pomenovanie v jazyku C++ | Pomenovanie v jazyku PHP |
1 | áno (signed) | 7 | -128 alebo -127 |
127 | Shortint | char | x |
1 | nie (unsigned) | 8 | 0 | 255 = 28-1 | Byte | unsigned char | x |
2 | áno (signed) | 15 | -32 768 alebo -32 767 |
32 767 | Smallint or Integer | short int | x |
2 | nie (unsigned) | 16 | 0 | 65 535 = 216-1 | Word | unsigned short int | x |
4 | áno (signed) | 31 | -2 147 483 648 alebo -2 147 483 647 |
2 147 483 647 | Longint or Integer | long int | Integer |
4 | nie (unsigned) | 32 | 0 | 4 294 967 295 = 232-1 | Longword | unsigned long int | x |
8 | áno (signed) | 63 | -9 223 372 036 854 775 808 alebo -9 223 372 036 854 775 807 |
9 223 372 036 854 775 807 | Int64 | long long int | x |
8 | nie (unsigned) | 64 | 0 | 18 446 744 073 709 551 615 | QWord | unsigned long long int | x |
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. Viac >>