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):
    1. Ota luvun positiivinen binääriesitys.
    2. Käännä kaikki bitit (0 → 1, 1 → 0).
    3. Lisää 1 tulokseen.
  • 2:n komplementti → desimaali:
    1. Jos korkein bitti on 0, kyseessä on positiivinen luku — tulkitse binäärin arvona.
    2. 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.