Informaatika õppesessioon, 16.11.2013 mis on kala kõhus ehk kuidas andmeid arvuti mälus esitatakse ja protsessoris töödeldakse Mida kala kõhus EI OLE - (ilusa nimega) muutujaid - arvusid (matemaatilises mõttes) - objekte, funktsioone, ... - tsükleid - tingimuslauseid - sõnesid (stringe) Bitid ja baidid - positsioonilised arvusüsteemid (2,8,16) - täisarvude esitamine - ületäitumine - märgiga ja märgita arvud - 8-, 16-, 32-, 64-bitised arvutid - mitmebaidised arvud - little-endian, big-endian - network byte order - binary coded decimal - ujukomaarvu esitamine arvutis - ratsionaalarvu 1/N (mitte)perioodilisuse sõltuvus arvusüsteemi alusest; vt. lisa - täpsuse kadu, liitmise mitteassotsiatiivsus - -0, +0, -Inf, +Inf, NaN Protsessor, registrid, mälu - üldine mälu pilt, andmed, programmikood - taktsagedus - instruction pointer - registrid - viida mõiste mälu addresseerimisel - elementaaroperatsioonid, mida CPU teeb - võrdlusoperatsioonid, ületäitumised ja FLAGS - (tingimuslik) jmp Masiiv ja viit - viit on olemusel täisarv -> võimalik ületäitumine! - massiivi indekseerimine baasaadressi ja nihkega - "üle serva" indekseerimine Alamprogrammide tugi - pinu - SP, push, pop - call, ret - lokaalmuutujad - parameetrite edastamine Teksti esitamine arvutis - iga sümbol on tõlgendatav täisarvuna ('3' + 2 == '5') - sõne (string) on sümbolite massiiv * C: piiramatu pikkusega, \0 lõpus * Pascal: tekst - ühe baidi kaupa töötlemine sageli ebaefektiivne! - näide: C-tüüpi sõnele sümboli lõppu lisamine: 1) tuvasta pikkus (L) 2) eralda tükk mälu (L+1) 3) kopeeri algne väärtus 4) lisa lõppu sümbol c 5) lisa '\0' 6) muuda viit näitama uuele sõnele - sõnede omavahelise omistamise, erinevad variandid: * viitade vahetamine * mälu kopeerimine - tühja sõne all võidakse mõelda erinevaid asju: * 0-väärtusega viit (nullpointer) * viit sõnele pikkusega 0 (ja talle võib olla eraldatud mingi (nullist suurem) hulk "ruumi") * mingite maagiliste sümbolitega täidetud sõne (tühikud, reavahetus, vms) Tegelikult on kõik veel keerulisem... Arvuti mälus hoitav baitide jada, ilma teadmiseta, mis kooditabeli alusel seda tuleks tõlgendada, ei võimalda üheselt otsustada, mis sümboleid konkreetne bait (baidid) esitavad. Teisendused erinevate kooditabelite vahel võivad olla kadudega, kui siht-tabelis vastavat sümbolit ei leidu (mõni baidijada võib konkreetses tabelis üldse mitte midagi tähendada). Sisend-/väljundseadmetel ja programmidel on tavaliselt mingi ettemääratud (seadistatud) kooditabel, mida nad eeldavad: - ASCII - ISO-8859-15 - KOI-8 - Unicode UTF-8, UCS-2, UCS-4, BOM - EBCDIC Hea programm (Linuxis): iconv Tekstifailid - reavahetused: - Linux, uuem MacOS: \n - Windows, DOS: \r\n - vanem MacOS: \r - kas viimase rea lõpus on reavahetus? - EOT sümbol - mõned programmid tõlgendavad seda kui (teksti)faili lõppu (windows copy!) - MIS KOODITABEL? Lisa (1/5 - kahendsüsteemis) 1 : 101 = 0.00110011... 1000 101 ---- 110 101 --- 1000 101 ----