Vědět víc - vzdělávací portál pro zvídavé


Lab 4: Deklarace proměnných

Slide

Příkaz DIM si vyzkoušíme na různých typech proměnných. Můžete použít následující program nebo jenom jeho části. 

Abychom nemuseli mazat zajímavé kusy programu, můžeme s výhodou využít komentář - pokud část programu takzvaně zakomentujeme, tj. označíme jako komentář, kompilátor ji vynechá.

Vyzkoušíme textové řetězce:

DIM SLOVO AS STRING * 8
DIM slovo1 AS STRING
DIM SLOVO$
INPUT "string 8 znaku:", SLOVO
INPUT "string neohraniceny:", slovo1
INPUT "string obecny:", SLOVO$
PRINT SLOVO
PRINT slovo1
PRINT SLOVO$

Všimněte si, že příkaz INPUT hlídá počet znaků, které můžeme zadat. U proměnné SLOVO nám dovolí zadat pouze 8 znaků. Ostatní by prostě nebylo kam uložit. 

Pokud by tato “ochrana” nefungovala, mohlo by dojít k přepsání obsahu paměti znaky, které zadáme. Takové přepsání (často nazývané buffer overflow) je jedním z nejjednodušších hackerských útoků (přesněji řečeno exploitů). Pokud se nám totiž podaří přepsat část paměti, kde je normálně uložen kód, bude počítač interpretovat “naše” znaky jako strojový kód. Záleží pak už jen na nás, co do paměti vložíme.

Vyzkoušejme nyní celočíselné typy:

DIM A AS INTEGER
DIM A1%
DIM UINT AS _UNSIGNED INTEGER
DIM lng AS LONG
DIM int64 AS _INTEGER64
INPUT "Integer obycejny:", A
PRINT A
A = A * 2
PRINT A
INPUT "Integer s priponou:", A1%
PRINT A1%
A1% = A1% * 2
PRINT A1%
INPUT "Unsigned int:", UINT
PRINT 2 * UINT
UINT = 2 * UINT
PRINT UINT
INPUT "Long :", lng
PRINT lng
lng = INT(lng / 3)
PRINT lng
INPUT "Int 64:", int64
PRINT int64
int64 = int64 ^ 2
PRINT int64

Zkuste zadat proměnné typu INTEGER nějakou velkou hodnotu, např. 32000. Co se stane, když tuto hodnotu vynásobíme dvěma?

Objeví se zdánlivě nesmyslné číslo. Ale je to pouze zdání. Co se stalo? Výsledek se nám nevešel do počtu bitů, který proměnná používá. A co na to počítač? Co se nevešlo jednoduše ořízl. Protože však pracuje v doplňkovém kódu, interpretuje výsledek jako záporné číslo.

Stejného efektu dosáhnete i u “delších” celočíselných typů. Jen je třeba experimentovat s většími čísly - na hranici rozsahu.

Všimněte si, že příkaz INPUT nám dovolí zadat pouze čísla, která se do daného datového typu vejdou.

Vyzkoušejte, jak velké číslo je možné zadat do typu _UNSIGNED INT.

Podívejte se, jak se chová celočíselný typ při operaci, která vytváří desetinné číslo. Třeba dělení třemi. Vyberte však číslo, které NENÍ dělitelné třemi.

QB64 automaticky zajistí zaokrouhlení, a to matematické. Tedy pětka se již zaokrouhluje nahoru.

 Na závěr se podíváme na čísla v plovoucí řádové čárce.

DIM s AS SINGLE
DIM d AS DOUBLE
DIM f AS _FLOAT
s = 1 / 3
d = 1 / 3
f = 1 / 3
PRINT s
PRINT d
PRINT f
s = s * 10 ^ 25
d = d * 10 ^ 160
f = f * 10 ^ 160
PRINT s
PRINT d
PRINT f
f = f * f
d = d * d
PRINT d
PRINT f
d = d / 10 ^ 250
f = f / 10 ^ 250
PRINT d
PRINT f

Na začátku si deklarujeme tři různé proměnné různých datových typů. Následně je naplníme výsledkem dělení 1:3. A čísla si ihned vytiskneme.

Poté čísla vynásobíme velkým číslem. V případě proměnné s, která je typu SINGLE musíme zvolit číslo mírně menší, jinak bychom “přetekli”.

Zatím jsme stále ještě “v limitu” - to potvrzuje i příkaz PRINT.

Dále vynásobíme čísla sebou samými. Po vytisknutí vidíme, že jsme v obou případech “přetekli”. INF znamená infinity, tedy nekonečno. Prostě moc.

Co když ale čísla vydělíme něčím hodně velkým (ve výrazu chybí závorky, mocnina má totiž přednost před násobením a dělením, proto nejsou třeba).

Číslo d je nadobro zničeno, ale v proměnné f hodnota zůstala. Pouze příkaz PRINT ji neumí vypsat.