You are on page 1of 25

Organizace předmětu,

číselné soustavy a kódování čísel


ISU-cv01

Ing. Jakub Husa


Vysoké Učení Technické v Brně, Fakulta informačních technologií
Božetěchova 1/2. 612 66 Brno - Královo Pole
ihusa@fit.vutbr.cz

10. února 2021


Organizace předmětu
Úvod
Programování na strojové úrovni navazuje na předmět IZP:
• Programy napsané v jazyce C (i ostatních jazycích) se při překladu předvádějí do
jazyka symbolických adres ze kterého je pak sestavován spustitelný soubor.

• V ISU se budeme učit psát programy přímo na úrovni jazyka symbolických adres
(nazývaného také jazyk symbolických instrukcí, nebo lidově assembler) abychom
lépe pochopili způsob práce procesoru a porozuměli jeho fyzickým omezením.
ISU-cv01 3 / 25
Průběh výuky

Výuka předmětu se skládá z přednášek a cvičení:


• V předmětu nejsou žádné projekty.
• Vaše účast ve výuce je ZCELA DOBROVOLNÁ.

Body dostáváte za tři bodované testy, půlsemestrální, a semestrální zkoušku:


• 6. týden – 1. test (6b) – posuvy bytů, výpočet celočíselné rovnice.
• 7. týden – půlsemestrálka (12b).
• 10. týden – 2. test (12b) – práce s poli, tvorba a volání funkcí.
• 13. týden – 3. test (10b) – práce s desetinnými čísly.
• zkouškové – semestrálka (60b).
• Během semestru můžete získat až pět prémiových bodů za aktivitu ve výuce.

Veškerá výuka s výjimkou semestrální zkoušky je plánována jako distanční:


• Plán se během semestru může měnit podle současné epidemiologické situace.

ISU-cv01 4 / 25
Zdroje informací

Většina informací je zveřejňována na wiki předmětu:


• Najdete zde obsah všech přednášek, cvičení, a soubory ke stažení.
• V záložce cvičení najdete odkazy na materiály od jednotlivých cvičících.
• Ty na které se zrovna díváte jsou na https://www.fit.vut.cz/person/ihusa/teaching/
• Další aktuality můžete najít také na kartě předmětu.

Pro oficiální komunikaci používejte výhradně váš školní e-mail:


• Garant – Filip Orság Ph.D (místnost S202, orsag@fit.vut.cz).
• Cvičící – Ing. Jakub Husa (místnost L307, ihusa@fit.vut.cz).
• Konzultace jsou dostupné přes MS Teams, kdykoliv po dohodě emailem.
• Pro neoficiální komunikaci můžete použít také fakultní discord.

ISU-cv01 5 / 25
Koho kde najdete (pokud nás někdy pustí zpátky na fakultu)

ISU-cv01 6 / 25
Jak to dopadlo v minulém roce

Pro úspěšné zvládnutí předmětu


potřebujete splnit tyto tři podmínky:
• Před zkouškou potřebujete zápočet
20 bodů (ze 40).
• Ze zkoušky potřebujete minimum
25 bodů (ze 60).
• Dohromady potřebujete alespoň
50 bodů (ze 100).

Minulý rok ISU nezvládlo 32% studentů:


• 183 jich nedostalo zápočet.
• 7 jich nezvládlo zkoušku.
• 1 neměl dostatek bodů.

Výsledky studentů z minulého roku.

ISU-cv01 7 / 25
Číselné soustavy
Číselné soustavy
Stejná čísla v
různých soustavách
Poziční číselná soustava je způsob reprezentace čísel pomocí 2 8 10 16
posloupnosti číslic:
0 0 0 0
• Základem soustavy je počet číslic které daná soustava používá. 1 1 1 1
• Normálně používáme desítkovou soustavu s číslicemi 0-9. 10 2 2 2
• Na strojové úrovni obvykle používáme soustavu dvojkovou 0-1, 11 3 3 3
šestnáctkovou 0-F, nebo výjimečně i osmičkovou 0-7. 100 4 4 4
101 5 5 5
110 6 6 6
• V matematice základ soustavy označujeme závorkami 111 7 7 7
s pravým dolním indexem: 1000 10 8 8
(1000001)2 = (101)8 = (65)10 = (41)16 1001 11 9 9
1010 12 10 A
• V programování základ soustavy označujeme předponou 1011 13 11 B
na začátku, nebo příponou na konci čísla: 1100 14 12 C
1101 15 13 D
0b1000001 = 0o101 = 65 = 0x41
1110 16 14 E
1000001b = 101o = 65 = 41h 1111 17 15 F
10000 20 16 10
ISU-cv01 9 / 25
Převod celých čísel do desítkové soustavy

Při převodu do desítkové soustavy počítáme sumu číslice krát mocnina základu:
• Jednotky mají vždy mocninu nula a mocnina číslic nalevo od nich se vždy
o jedna zvyšuje.

• Převod z dvojkové do desítkové:

(1101)2 = 1 ∗ 23 + 1 ∗ 22 + 0 ∗ 21 + 1 ∗ 20 = 8 + 4 + 0 + 1 = (13)10
• Převod z osmičkové do desítkové:

(456)8 = 4 ∗ 82 + 5 ∗ 81 + 6 ∗ 80 = 256 + 40 + 6 = (302)10


• Převod z šestnáctkové do desítkové:

(123)16 = 1 ∗ 162 + 2 ∗ 161 + 3 ∗ 160 = 256 + 32 + 3 = (291)10

ISU-cv01 10 / 25
Na procvičení

Vyzkoušejte si převod čísel do desítkové soustavy:

(234)16 = (...)10

(110 0100)2 = (...)10

(555)8 = (...)10

(1 200)16 = (...)10

(1101 0110)2 = (...)10

ISU-cv01 11 / 25
Převod celých čísel z desítkové soustavy

Při převodu z desítkové soustavy celočíselně dělíme základem cílové soustavy:


• Výsledek získáme přečtením zbytků po dělení směrem odspodu nahoru.

• Převod čísel z desítkové soustavy do:

dvojkové osmičkové šestnáctkové


(20)10 = (1 0100)2 (83)10 = (123)8 (140)10 = (8C)16
20 /2 = 10 zb 0 83 /8 = 10 zb 3 140 /16 = 8 zb 12
10 /2 = 5 zb 0 10 /8 = 1 zb 2 8 /16 = 0 zb 8
5 /2 = 2 zb 1 1 /8 = 0 zb 1
2 /2 = 1 zb 0 pamatujte
1 /2 = 0 zb 1 (12)10 = (C)16

ISU-cv01 12 / 25
Na procvičení

Vyzkoušejte si převod čísel z desítkové soustavy:


(180)10 = (...)2 (105)10 = (...)2 (200)10 = (...)8
... /2 = ... zb ... ... /2 = ... zb ... ... /8 = ... zb ...
... /2 = ... zb ... ... /2 = ... zb ... ... /8 = ... zb ...
... /2 = ... zb ... ... /2 = ... zb ... ... /8 = ... zb ...
... /2 = ... zb ... ... /2 = ... zb ...
... /2 = ... zb ... ... /2 = ... zb ... (357)10 = (...)16
... /2 = ... zb ... ... /2 = ... zb ... ... /16 = ... zb ...
... /2 = ... zb ... ... /2 = ... zb ... ... /16 = ... zb ...
... /2 = ... zb ... ... /16 = ... zb ...
(93)10 = (...)16
... /16 = ... zb ...
... /16 = ... zb ...

ISU-cv01 13 / 25
Přímý převod celých čísel bez desítkové soustavy
Pokud převádíme mezi dvojkovou a osmičkovou (nebo šestnáctkovou) soustavou
čísla můžeme převést i bez náročného počítání, rozdělením na N-tice:
• Jeden znak osmičkové soustavy odpovídá třem znakům dvojkové soustavy.
• Jeden znak šestnáctkové soustavy odpovídá čtyřem znakům dvojkové soustavy:

(3D0)16 = 3 D 0
0011 1101 0000 = (11 1101 0000)2
• Rozdělování vždy začínáme na pozici desetinné čárky a případná prázdná místa
doplňujeme nulami:
(1 010 101 011)2 = 001 010 101 011
1 2 5 3 = (1253)8
• Nejrychlejší způsob jak převést číslo z šestnáctkové do osmičkové soustavy
(a obráceně) je přes dvojkovou soustavu:
(7B9)16 = 7 B 9
0111 1011 1001
011 110 111 001
3 6 7 1 = (3671)8

ISU-cv01 14 / 25
Na procvičení

Vyzkoušejte si převod čísel bez desítkové soustavy:


(1234)8 = ... ... ... ...
... ... ... ... = (...)2

(10111000101)2 = ... ... ... ...


... ... ... ... = (...)8

(5CE6)16 = ... ... ... ...


... ... ... ... = (...)2

(1101001110101001)2 = ... ... ... ...


... ... ... ... = (...)16

(4537)8 = ... ... ... ...


... ... ... ...
... ... ...
... ... ... = (...)16

ISU-cv01 15 / 25
Desetinná čísla

V programování (nejen na strojové úrovni) rozlišujeme mezi desetinnými čísly


s pevnou a plovoucí řádovou čárkou:
• Většinu semestru budeme v ISU pracovat pouze s celými čísly, zhruba
odpovídajícími C-čkovému datovému typu int.
• Ke konci semestru si ukážeme i desetinná čísla s plovoucí řádovou čárkou
zhruba odpovídající C-čkovému datovému typu float.
• Čísla s plovoucí řádovou čárkou používají speciální formát kódování čísel
a vysvětlíme si je proto později.

Desetinná čísla s pevnou řádovou čárkou tento semestr používat nebudeme:


• Následující tři slajdy uvádím pouze pro úplnost a můžete je proto ignorovat.

ISU-cv01 16 / 25
Převod desetinných čísel do desítkové soustavy
Při převodu do desítkové soustavy počítáme sumu číslice krát mocnina základu:
• Jednotky mají vždy mocninu nula, mocnina číslic nalevo od nich se vždy
o jedna zvyšuje, mocnina číslic napravo od nich se vždy o jedna snižuje.

• Převod z dvojkové do desítkové:

(110.101)16 = 1 ∗ 22 + 1 ∗ 21 + 0 ∗ 20 + 1 ∗ 2−1 + 0 ∗ 2−2 + 1 ∗ 2−3 =

1 1
=1∗4+1∗2+1∗ +1∗ =
2 8
= 4 + 2 + 0.5 + 0.125 = (6.625)10

• Převod z šestnáctkové do desítkové:

(AB.CD)16 = A ∗ 161 + B ∗ 160 + C ∗ 16−1 + D ∗ 16−2 =

1 1
= 10 ∗ 16 + 11 ∗ 1 + 12 ∗ + 13 ∗ =
16 256
= 160 + 11 + 0.75 + 0.05078125 = (171.80078125)10
ISU-cv01 17 / 25
Převod desetinných čísel z desítkové soustavy

Při převodu z desítkové soustavy:


• Celou část celočíselně dělíme základem cílové soustavy a výsledek získáme
přečtením zbytků po dělení směrem odspodu nahoru.
• Desetinnou část násobíme základem cílové soustavy a výsledek získáme
přečtením přenosů přes desetinnou čárku směrem shora dolů.

• Převod desetinného čísla z desítkové do dvojkové soustavy:

(12.8125)10 = (12)10 + (0.8125)10 = (1100)2 + (0.1101)2 = (1100.1101)2

(12)10 = (1100)2 (0.8125)10 = (0.1101)2


12 /2 = 6 zb 0 0.8125 *2 = 1 .625
6 /2 = 3 zb 0 0.625 *2 = 1 .25
3 /2 = 1 zb 1 0.25 *2 = 0 .5
1 /2 = 0 zb 1 0.5 *2 = 1 .0

ISU-cv01 18 / 25
Přímý převod desetinných čísel bez desítkové soustavy
Pokud převádíme mezi dvojkovou a osmičkovou (nebo šestnáctkovou) soustavou
čísla můžeme převést i bez náročného počítání, rozdělením na N-tice:
• Jeden znak osmičkové soustavy odpovídá třem znakům dvojkové soustavy.
• Jeden znak šestnáctkové soustavy odpovídá čtyřem znakům dvojkové soustavy:
• Rozdělování vždy začínáme na pozici desetinné čárky a případná prázdná místa
doplňujeme nulami:

(34.56)8 = 3 4 5 6
011 100 101 110 = (11 100.101 11)2

(AB.CD)16 = A B C D
1010 1011 1100 1101 = (1010 1011.1100 1101)2

(11 100 110.001 101)2 = 011 100 110 001 101


3 4 6 1 5 = (346.15)8

(10 0110.1011 111)2 = 0010 0110 1011 1110


2 6 B E = (26.BE)16

ISU-cv01 19 / 25
Kódování čísel
Kódování čísel
Na strojové úrovni se při reprezentaci čísel vždy musíme řídit hardwarovými
omezeními architektury procesoru:
• V ISU budeme pracovat pouze s architekturou x86, moderní počítače už
používají novější (a výrazně složitější) architektury jako například x86-64.
• Celá čísla se v procesoru vždy ukládají do registrů o délce 8, 16, nebo 32 bitů.
• Každý bit může obsahovat pouze hodnoty nula a jedna (dvojková soustava).
• Například, číslo 1 uložené v 8b registru AL, 16b registru AX a 32b registru EAX:

• Nuly na začátcích registrů NEMŮŽEME vynechávat.


• Aby bylo možné do registrů ukládat také záporná čísla, používá se pro ně
místo znaménka mínus takzvaný doplňkový kód.
ISU-cv01 21 / 25
Doplňkový kód
Čísla začínající jedničkou se v doplňkovém kódu interpretují jako záporná:
• Kladné číslo do registru uložíme ve dvojkově, a zleva ho doplníme nulami.
• záporné číslo do registru uložíme jako kladné, a potom u něj obrátíme znaménko
provedením dvokového doplňku který invertuje všechny bity a přičte jedničku:

(3)10 = 0 0 0 0 0 0 1 1
invertované (3) = 1 1 1 1 1 1 0 0
1 =00000001
invertované (3) + 1 = 1 1 1 1 1 1 0 1 = (-3)10

• Doplňkový kód mění rozsah hodnot které můžeme uložit do 8b registru


z rozsahu 0 až 255, na rozsah -128 až 127.
• Pokud chceme zjisti jaké číslo je v registru uložené, nejprve u něj dvojkovým
doplňkem obrátíme znaménko a potom ho převedeme do desítkové soustavy:

(-3)10 = 1 1 1 1 1 1 0 1
invertované (-3) = 0 0 0 0 0 0 1 0
1 =00000001
invertované (-3) + 1 = 0 0 0 0 0 0 1 1 = (3)10

ISU-cv01 22 / 25
Aritmetika v doplňkovém kódu
Doplňkový kód nám umožňuje provádět sčítání a ostatní aritmetické operace:
• Pokud došlo k přenosu do nejvyššího bitu registru, výsledek součtu
změnil znaménko nastalo u něj přetečení (overflow).
• Pokud došlo k přenosu z nejvyššího bitu registru, výsledek součtu
se do registru nevešel a nastal u něj přenos (carry).

10 = 0 0 0 0 1 0 1 0
• Overflow NE +11 = 0 0 0 0 1 0 1 1
Carry NE 0 0 0 1 0 1 0 1 = 21 ok

100 = 0 1 1 0 0 1 0 0
• Overflow ANO
+50 = 0 0 1 1 0 0 1 0
Carry NE
1 0 0 1 0 1 1 0 = -106 chyba
• Pokud při sčítání dojde k přenosu i přetečení, obě chyby se vzájemně vyruší
a výsledkem součtu bude platné číslo:

-6 = 1 1 1 1 1 0 1 0
• Overflow ANO +9 = 0 0 0 0 1 0 0 1
Carry ANO 100000011 =3 ok

ISU-cv01 23 / 25
Přímý kód a Kód transformované nuly
Kromě doplňkového kódu existují také přímý kód a kód transformované nuly
používané pro kódování čísel s plovoucí řádovou čárkou:
• Přímý kód interpretuje první bit registru jako znaménko (0 = plus, 1 = mínus).
• Kód transformované nuly posouvá počátek osy čísel na hodnotu 100... :

přímý kód transformovaná nula


číslo obsah reg. číslo obsah reg.
127 0111 1111 127 1111 1111
126 0111 1110 126 1111 1110
2 0000 0010 2 1000 0010
1 0000 0001 1 1000 0001
0 0000 0000 0 1000 0000
-0 1000 0000 -1 0111 1111
-1 1000 0001 -2 0111 1110
-2 1000 0010 -3 0111 1101
-126 1111 1110 -127 0000 0001
-127 1111 1111 -128 0000 0000

• Tyto kódy neumožňují aritmetické operace.

ISU-cv01 24 / 25
Na procvičení

Vyzkoušejte převést číslo z desítkové soustavy do doplňkového kódu na osmi bitech:


35 = ...

-27 = inv(27) + 1 = inv( ... )+1=


= ... +1= ...

-93 = inv(93) + 1 = inv( ... )+1=


= ... +1= ...

Vyzkoušejte převést číslo doplňkového kódu na osmi bitech do z desítkové soustavy:


0011 0110 = ...

1011 1001 = - ( inv( ... )+1)=


-( ... +1)= -( ... ) = ...

ISU-cv01 25 / 25

You might also like