200 likes | 381 Views
Lukujärjestelmät. Lukujärjestelmät. Ihmiset käyttävät kantalukuna 10 Tietokoneet käyttävät kantalukuna 2 (binaariluvut) Välimuotona 16 (heksadesimaaliluvut). Binaariluvut. Binaariluvun numero on bitti (BInary digiT) Bitin arvo voi olla 0 tai 1
E N D
Lukujärjestelmät • Ihmiset käyttävät kantalukuna 10 • Tietokoneet käyttävät kantalukuna 2 (binaariluvut) • Välimuotona 16 (heksadesimaaliluvut)
Binaariluvut • Binaariluvun numero on bitti (BInary digiT) • Bitin arvo voi olla 0 tai 1 • Luvun suurin arvo = 2n-1 (esim. 8 bittinen luku: 28-1=255) • (Koska ensimmäinen arvo on 0, mahdollisia arvoja on 2n) • Käytetään, koska laitetasolla on vain kaksi vaihtoehtoa: virta kulkee/ei kulje • Miksi ei käytetä kymmentä bittiä kuvaamaan yhtä desimaalinumeroa??
0 = 0 • 1 = 1 • 2 = 10 • 3 = 11 • 4 = 100 • 5 = 101 • 6 = 110 • 7 = 111 • 8 = 1000 • 9 = 1001 • 10 = 1010 • 11 = 1011 • 12 = 1100 • 13 = 1101 • 14 = 1110 • 15 = 1111
Binaarien yhteenlasku • Muista 1+1 = 10 eli nolla ja muistinumerona 1 • 1 1 1 1 • 110010110 • 110011 • 111001001
Heksadesimaaliluvut • Kantaluku on 16 • Numerot 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F • Käytetään, koska muunnos binaariluvusta hyvin helppo • Muistiosoitteet kerrotaan yleensä heksadesimaalilukuina • Merkintätapoja: • 24AC216 • 24AC2H tai 24AC2h • 0x24AC2
Muunnokset • Desimaali – binaari • Jaetaan luku kahdella. Jakojäännös on bitin arvo • Ensimmäinen jako antaa alimman bitin • Esim. 157 binaariksi • 157 / 2 = 78 jakojäännös 1 • 78 / 2 = 39 jakojäännös 0 • 39 / 2 = 19 jakojäännös 1 • 19 / 2 = 9 jakojäännös 1 • 9 / 2 = 4 jakojäännös 1 • 4 / 2 = 2 jakojäännös 0 • 2 / 2 = 1 jakojäännös 0 • 1 / 2 = 0 jakojäännös 1 • Tulos = 10011101
Muunnokset • Binaari – heksadesimaali • Jaetaan binaariluku neljän bitin palasiin ja muutetaan jokainen palanen erikseen • Esim: 101 0011 0110 1010 1101 • 1101 = D • 1010 = A • 0110 = 6 • 0011 = 3 • 101 = 5 • Tulos = 536AD
Muunnokset • Desimaali – heksadesimaali • Jaetaan lukua 16:lla • Jakojäännös on numeron arvo • Ensimmäinen jako antaa alimman numeron arvon
Muunnokset • Binaari – desimaali • Periaatteessa voitaisiin jakaa binaarilukua kymmenellä, mutta se olisi hankalaa • Kerrotaan jokainen bitti vastaavalla kertoimella: • Alin kerrotaan 1:llä (20) • Seuraava 2:lla (21) • Seuraava 4:llä (22) • jne. *256 (=28) *128 (=27) *32 (=25) *16 (=24) *64 (=26) *1 (=20) *2 (=21) *4 (=22) *8 (=23) 1 0 1 1 0 1 0 1 0 = 256 + 64 + 32 + 8 + 2 = 263
Kiinteän kokoiset binaariluvut • Tietokoneissa käytettävät binaariluvut ovat lähes aina kiinteän mittaisia: 8, 16, 32, 64 bittisiä • Luvulla on aina ylä- ja alaraja, joita ei voi ylittää • Yritys ylittää aiheuttaa virheellisen arvon tai virheilmoituksen • Jokaisella bitillä on aina arvo. Luku nolla tarkoittaa, että jokainen bitti on nolla • Luvun suurin arvo = 2n-1 (esim. 8 bittinen luku: 28-1=255) • Koska ensimmäinen arvo on 0, mahdollisia arvoja on 2n
Etumerkilliset binaariluvut • Binaariluvut alun perin etumerkittömiä eli arvot alkavat nollasta, (koska vain arvot 0 tai 1 mahdollisia bitille eli ei etumerkkiä.) • Etumerkilliset luvut esitetään yleensä ns. kahden komplementtilukuina. • Kahdenkomplementtia voidaan käyttää vain määrämittaisilla binaariluvuilla!!! • Kahden komplementti luvussa käytännössä ensimmäinen (yli) bitti kertoo, onko luku positiivinen vai negatiivinen (1 tarkoittaa negatiivista)
Kahdenkomplementti • Muunnos: • (Muutetaan luku normaalisti binaariseksi esim. Jakamalla kahdella) • Jos luku on negatiivinen: • Käännetään kaikki bitit (0 -> 1, 1 -> 0) • Lisätään lukuun 1 • -157 16-bittisenä lukuna: • 157 = 0000 0000 1001 1101 • Käännetään bitit: 1111 1111 0110 0010 • Lisätään yksi: 1111 1111 0110 0011
Kahdenkomplementti • Luvun minimi arvo on -2n-1 • Maksimiarvo on 2n-1-1 • 8 bittinen: -128 ... 127 • 16 bittinen: -32768 ... 32767
Liukuluvut • Liukulukuja käytetään, kun tarvitaan suurta lukualuetta ja lukuja, joissa on murto-osa • Lähes aina käytetään IEEE:n määrittelemiä lukutyyppejä. • Periaate: • Mikä tahansa luku voidaan esittää muodossa m * 10e • Tai tietokoneessa mieluummin m * 2e • Nimityksiä: • M on mantissa • E on exponentti
IEEE liukuluvut • Esimerkiksi 4 tavuinen liukuluku (float javassa ja C:ssä) • 1 bitti on etumerkki • Seuraavat 8 exponentti • Loput (23 bittiä mantissa) • 0|1111 1111|000 0000 0000 0000 • Exponentilla ei ole etumerkkiä! • Exponentti on biasoitu: Arvoon lisätään 127. • Mantissassa ensimmäinen bitti on aina 1. Siksi sitä ei turhaan talleteta. Käytännössä siis mantissa on 24 bittinen
IEEE liukuluvut • Muutetaan 2005 liukuluvuksi • 2005 on binaarisena 111 1101 0101. • Ensimmäisen bitin jälkeen on 10 bittiä, joten exponentti on 10 eli 1010 binaarisena. • Mantissa = (1)1111010101 , ensimmäinen bitti jätetään pois • Exponentti = 10 + 127 = 1010 + 111 1111 =10000101 • 0|10000101|11110101010000000000000 • Loppu täytetään nollilla
IEEE liukuluvut • Mantissan ensimmäinen bitti on aina 1 • Ensimmäistä bittiä ei talleteta, joten mantissan tarkkuus on todellisuudessa 24 bittiä • Poikkeuksena luku nolla, jossa kaikki liukuluvun bitit ovat nollia (etumerkki, exponentti ja mantissa) • Exponentin arvo 0-255 biasoituna eli -127...128 • Suurin arvo on 2128 eli noin 1038 • Mantissan suurin arvo on 1,111 1111 1111 1111 1111 1111 = 16777215 / 210 • Mantissa on siis tarkkuudeltaan 7 numeroa!
IEEE liukuluvut • 64 bittinen liukuluku • Double javassa ja C:ssä • 1. bitti etumerkki • 11 bittiä exponentti • 52 bittiä mantissa. Koska ensimmäistä bittiä ei talleteta, bittejä on käytännössä 53 • Bias 1023 • 0|11111111111|0000000000000000000000000000000000000000000000000000 • Exponentti välillä -1023 ... 1024. Kymmenjärjestelmässä noin -308 ... +308
IEEE liukuluvut • Single • ±1.2 *10-38 • ±3.4 *1038 • Tarkkuus 6-9 numeroa • Double • ±2.2 *10-308 • ±1.2 *10308 • Tarkkuus 14-17 numeroa • Extended • ±3.4 *10-4932 • ±1.2 *104932 • Tarkkuus 18-21 numeroa