Mälu ja baidid: baidijärjestus, tüübid ja aadressid

Mälus on igal aadressil üks bait. Suurem arv hõlmab mitut baiti. Millised baidid kuuluvad kokku, mis järjekorras neid lugeda ja mis tüüpi arvuna tõlgendada, määrab lugemiskäsk. Vali allpool lugemise seaded. Kasutatavad baidid tõstetakse esile ning iga baidi all on järgu kaal, millega selle väärtus korrutatakse.

Interaktiivse simulatsiooni laadimine...

Õppetund

Teooria — Mälu ja baidid: baidijärjestus, tüübid ja aadressid

Bait koosneb kaheksast bitist ja selle väärtus on 0 kuni 255. Igal mäluaadressil on üks bait. Suurem arv hõlmab järjestikuseid aadresse: 32-bitine täisarv näiteks nelja. Baidijärjestus määrab, millises järjekorras need baidid paiknevad. Väikseimal aadressil võib olla kas väikseima või suurima kaaluga bait. Märgita täisarvuna lugedes annavad neli baiti väärtuse b₀·256⁰ + b₁·256¹ + b₂·256² + b₃·256³, kus bₖ on järgus k oleva baidi väärtus. Märgiga täisarvuna lugedes lahutatakse sellest summast 2³², kui summa on vähemalt 2³¹. Ujukomaarvuna lugedes tõlgendatakse samu bitte standardi IEEE 754 järgi.

Mida iga sümbol tähendab

bₖ
järgus k oleva baidi väärtus; järgud on 0 (väikseima kaaluga) kuni 3
256ᵏ
järgu kaal: 1, 256, 65 536 või 16 777 216
Eeldab
Märgiga täisarvud on täiendkoodis ja ujukomaarvud standardi IEEE 754 kohaselt ühekordse täpsusega, nagu kõigis tänapäeva lauaarvutite ja telefonide protsessorites. Teksti puhul vastab igale märgile üks bait ning kasutatakse ASCII märgikoodi. Enamikus failides praegu kasutatav UTF-8 võib ühe märgi jaoks vajada kuni nelja baiti.

Vale baidijärjestusega lugedes saab arvust 1 arv 16 777 216 🖖

Vajuta nuppu 1 tagurpidi lugedes. x86-protsessor ja telefonides kasutatava seadistusega ARM-protsessor salvestavad arvu 1 32-bitise täisarvuna nii, et 01 asub väikseimal aadressil ja sellele järgneb kolm nullbaiti. Esimesena salvestatakse väikseima kaaluga bait. Kui lugemiskäsk eeldab esimesena suurima kaaluga baiti, saab sama 01 kaaluks 256³ ning arvu väärtuseks 16 777 216. Baidid ise jäid samaks. Võimalikust 4 294 967 296 eri 32-bitisest väärtusest annavad mõlemat pidi lugedes sama tulemuse vaid need 65 536, mille esimene bait võrdub neljandaga ja teine kolmandaga. Nende hulka kuulub ka −1 ehk FF FF FF FF. Danny Cohen nimetas need kaks järjestust 1980. aastal „little-endian“ ja „big-endian“, viidates Gulliveri reisides kirjeldatud sõjale selle üle, kummast otsast keedumuna katki lüüa.

π ja 1 078 530 011 koosnevad samast neljast baidist 🖖

Vajuta nuppu π täisarvuna. 32-bitise ujukomaarvuna salvestatud π (ümardatuna lähima esitatava väärtuseni 3,14159274) koosneb neljast baidist: DB 0F 49 40. Märgiga täisarvuna lugedes annavad need 1 078 530 011. Vaheta baidijärjestust ja tulemuseks on −619 755 200. Tekstina on neis kaks märki, I ja @, ning kaks baiti, millele ei vasta prinditavat märki. Ükski bait ei ütle, et tegu on ujukomaarvuga. Little Man Computeri õppemudel ei suutnud käsku arvust eristada. Ka baitidest koosnev mälu ei erista arvutüüpe: tüübi määrab lugemiskäsk. Seetõttu võib vale tüüpi kasutav programm saada vale tulemuse ilma ühegi veateateta.

Ühe aadressi võrra nihkes lugedes saab kahest positiivsest arvust negatiivne 🖖

Vajuta nuppu Aadressi võrra nihkes. Aadressil 0 on 1 000 ja aadressil 4 on 2 000, mõlemad salvestatud väikseima kaaluga bait ees: E8 03 00 00 D0 07 00 00. Kui 32-bitine lugemine algab aadressilt 0 asemel aadressilt 1, võetakse esimesest arvust 03 00 00 ja teisest D0. D0 satub suurima kaaluga järku: 3 + 208 × 256³ = 3 489 660 931. Märgiga täisarvuna on see −805 306 365, sest D0 kõrgeimas järgus olev bitt on seatud. Tulemusest ei leia kumbagi salvestatud arvu. Mälus polnud tähist, mis näitaks, kus üks arv lõpeb.

Ülesanne täielikult lahendatud

  1. Kui suur see pilt on? 4 sammu

    Vajuta nuppu PNG päis. Näed PNG-faili esimest 24 baiti. PNG-vormingu spetsifikatsiooni järgi salvestatakse kõik ühest baidist pikemad täisarvud suurima kaaluga bait ees. IHDR-ploki andmed algavad laiuse ja kõrgusega, kummagi jaoks neli baiti. Leia pildi laius ja kõrgus ning arvuta, millised mõõtmed saaks programm, mis loeks neid väikseima kaaluga bait ees.

    Ava see ülesanne tööriistas

    1. Fail algab kaheksabaidise tunnusjadaga 89 50 4E 47 0D 0A 1A 0A. Järgmised neli baiti annavad esimese ploki pikkuse, suurima kaaluga bait ees: 00 00 00 0D tähendab 13. Seejärel tuleb ploki tüüp 49 48 44 52, mis tekstina on IHDR. Ploki andmed algavad seega aadressilt 16.

    2. Laius asub aadressidel 16 kuni 19: 00 00 01 E0. Suurima kaaluga bait ees lugedes on 01 järgus kaaluga 256¹ ning E0 ehk 224 järgus kaaluga 256⁰: 256 + 224 = 480. Aadressilt 16 lugedes näitab tööriist sama tulemust.

    3. Kõrgus asub aadressidel 20 kuni 23: 00 00 01 0E, mis annab 256 + 14 = 270.

    4. Väikseima kaaluga bait ees lugedes saab suurima kaalu viimane bait. Laiuseks tuleks 224 × 256³ + 1 × 256² = 3 758 161 920 ja kõrguseks 14 × 256³ + 256² = 234 946 560.

    Vastus

    480 × 270 pikslit. Väikseima kaaluga bait ees lugedes annavad samad baidid mõõtmeteks 3 758 161 920 × 234 946 560 ehk ligikaudu 8,83 × 10¹⁷ pikslit. Kui iga piksli jaoks kulub neli baiti, vajaks selline pilt 3,53 × 10¹⁸ baiti. Fail ise baidijärjestust ei näita. Selle määrab vormingu spetsifikatsioon ning programm peab seda järgima.

Õpitee

Kuidas arvuti programmi täidab

Allikad (2)