Merkittyjen lukujen esitystavat: merkki-suuruusluokka ja 2:n komplementti
Oppaasi merkittyjen lukujen esitystapoihin: merkki‑suuruusluokka ja 2:n komplementti — selkeä selitys binääristen negatiivisten lukujen esittämisestä.
Tietokoneissa negatiivisten kokonaislukujen esittäminen binäärimuodossa vaatii selkeän säännön siitä, miten negatiivinen merkki tallennetaan. Yksinkertainen ajatus "yhden bittisarjan yksi bittiarvo kertoo pelkästään merkin ja loput bittiarvot lukuarvon" ei riitä sellaisenaan, koska ilman yhteistä sopimusta aritmetiikka, vertailut ja nollan esitys jäävät epäyhtenäisiksi. Tämän vuoksi on kehitetty useita esitystapoja; kaksi yleisintä tapausta ovat merkki ja suuruusluokka (sign-magnitude) sekä kaksikomplementti (2:n komplementti).
Merkki ja suuruusluokka (sign-magnitude)
Tässä esitystavassa korkein bitti (eli MSB, most significant bit) varataan merkkibitiksi: 0 tarkoittaa positiivista ja 1 negatiivista. Loput bitit kuvaavat luvun suuruutta (absoluuttista arvoa) binäärinä.
- Esimerkki 8-bittisessä muodossa:
- +5 = 00000101
- -5 = 10000101
- Arvoalue n-bittiselle merkkisuuruusluokalle: - (2^(n-1) - 1) ... + (2^(n-1) - 1). Esimerkiksi 8-bittisenä alue on -127 ... +127.
- Merkittävä erikoisuus: on olemassa kaksi esitystä nollalle — +0 (esim. 00000000) ja -0 (esim. 10000000).
- Plussat:
- Intuitiivinen: merkkibitti selkeästi erottaa etumerkin.
- Sopii hyvin lukujen suoraan tulostamiseen ihmiselle luettavassa muodossa.
- Miinukset:
- Kaksi nollaa tuhlaa yhden esityksen ja tekee vertailuista ja aritmetiikasta monimutkaisempaa.
- Yhteen- ja vähennyslaskun toteutus vaatii usein erillisen logiikan (täytyy tarkistaa merkit ja käsitellä itse absoluuttiset arvot), mikä tekee laitteistosta monimutkaisemman.
2:n komplementti (kaksikomplementti)
2:n komplementti on yleisin tapa esittää allekirjoitettuja kokonaislukuja tietokoneissa, koska se yksinkertaistaa aritmetiikkaa: sama lisäys- ja vähennysalgebra kuin epäallekirjoitetuilla luvuilla toimii modulo 2^n. Negatiivisen luvun muodostaminen tapahtuu käänteisesti: ensin käännetään bitit (yksikomplementti) ja sitten lisätään 1.
- Esimerkki 8-bittisessä muodossa:
- +5 = 00000101
- -5: käännä bitit → 11111010, lisää 1 → 11111011
- Arvoalue n-bittiselle 2:n komplementille: -2^(n-1) ... + (2^(n-1) - 1). Esimerkiksi 8-bittisenä alue on -128 ... +127.
- Etuna on, että nolla on yksikäsitteinen (vain yksi esitys) ja aritmetiikka voidaan toteuttaa tavallisilla binaarisilla yhteenlaskijapiireillä ilman erillistä merkinkäsittelyä.
- Ylimääräisenä huomiona: kun laajennat bittileveyttä (esimerkiksi 8 → 16 bittiä), 2:n komplementissa tehdään sign-extend eli korkein bitti toistetaan uusiksi lisättäviksi biteiksi (esim. 11111011 (8 bittiä) → 11111111 11111011 (16 bittiä)).
- Ylivuodon (overflow) tunnistus:
- Ylilyöntiä tapahtuu, kun kahden saman merkkisen luvun summan tulos vaihtaa merkin (esim. +127 + +1 = -128 8-bittisessä maailmassa).
- Matemaattisesti ylivuotoa ei voi havaita pelkällä kokonaisella uloskantobitillä, mutta se havaitaan vertaamalla lisäyksessä sisääntulojen ja tuloksen merkkibittejä.
Miten muuntaa luku 2:n komplementiksi ja takaisin
- Desimaali → 2:n komplementti (negatiivinen luku):
- Ota luvun positiivinen binääriesitys.
- Käännä kaikki bitit (0 → 1, 1 → 0).
- Lisää 1 tulokseen.
- 2:n komplementti → desimaali:
- Jos korkein bitti on 0, kyseessä on positiivinen luku — tulkitse binäärin arvona.
- Jos korkein bitti on 1, kyseessä on negatiivinen luku — ota tuloksesta 2^n - arvo (eli voit kääntää bitit, lisätä 1 ja tulkita saadun lukuarvon etumerkittömänä, tämän lopputuloksen edessä negatiivinen etumerkki).
Käytännön huomioita
- Useimmissa prosessoreissa ja ohjelmointikirjastoissa käytetään 2:n komplementtia sen yksinkertaisuuden ja tehokkuuden vuoksi.
- Kun suunnittelet bittileveyttä, muista tarkistaa arvoalueen sopivuus: 2:n komplement antaa yhden lisäarvon negatiiviseen suuntaan verrattuna merkki-suuruusluokkaan (esim. -128 ... +127 vs. -127 ... +127 8-bittisenä).
- Vertailu- ja aritmeettiset operaatiot käyttäytyvät eri tavoilla riippuen esitystavasta — erityisesti nollan moninaisuus (merkki-suuruusluokassa) ja ylivuodon tunnistus kannattaa huomioida suunnittelussa.
Yhteenvetona: merkki ja suuruusluokka on helppo ymmärtää mutta vähemmän tehokas aritmetiikassa (ja sisältää kaksi nollaa), kun taas 2:n komplementti mahdollistaa yksinkertaisemman ja tehokkaamman binäärialgebran, minkä vuoksi se on käytännössä yleisin tapa edustaa negatiivisia kokonaislukuja tietokoneissa.
Sign-and-magnitude
Sign and Magnitude toimii muuttamalla merkitsevimmän bitin (MSB - ensimmäinen numero) 1:ksi, jos luku on negatiivinen, ja vähentämällä lukua esimerkiksi yhdellä:
0000 0010 (2)
tulee...
1000 0010 (-2)
Tämä menetelmä negatiivisten binäärilukujen tallentamiseen ei toimi, koska:
- Binääriaritmetiikka ei toimi.
- Meidän on ensin tiedettävä, mitä tallennusmekanismia tietyn kielen kääntäjä käyttää.
1:n komplementti
1:n komplementti toimii esimerkiksi vaihtamalla 1:t 0:ksi ja 0:t 1:ksi:
0000 0010 (2)
tulee...
1111 1101 (-2)
Tämä on helposti määriteltävissä negatiiviseksi luvuksi, koska sen merkitsevin bitti on 1, aivan kuten sign-and-magnitude-menetelmässä.
2:n komplementti
2:n komplementti on vaikeampi tapa tallentaa negatiivit. Siinä on kolme vaihetta:
- Etsi positiivinen binääriluku (esim. 8base 10 = 0000 1000base 2).
- Vaihda 1:t 0:ksi ja 0:t 1:ksi (esim. 0000 1000base 2 muuttuu 1111 0111base 2:ksi).
Tämä tunnetaan nimellä "bittien kääntäminen" eli loogisen EI:n soveltaminen alkuperäiseen base 2 -esitykseen.
- Lisää 1 (esim. 1111 0111base 2 + 1base 2 = 1111 1000base 2).
Tästä menetelmästä pidetään, koska:
- Se on kuin merkki ja suuruus; negatiivinen luku alkaa 1:llä ja positiivinen luku alkaa 0:lla.
- Binääriaritmetiikka toimii.
- 0:lle on vain yksi arvo (0000 0000base 2).
Etsiä