Tietotekniikassa **komplementiksi** kutsutaan yleistä negatiivisen kokonaisluvun esitysmuotoa. Yleisin eli luvusta muodostettu kahden komplementti tarkoittaa luvun vastaluvun muodostamista kääntämällä sen bitit ja lisäämällä tulokseen yksi.

Historia
--------

Eräät varhaiset tietokoneet kuten UNIVAC 1100 -sarja ovat käyttäneet yhden komplementtia, mutta tämä on pääasiassa jäänyt pois käytöstä. Sen sijaan kahden komplementti on yleistynyt muun muassa IBM S/360:n vaikutuksesta.

Etumerkin käyttö
----------------

Negatiiviset luvut voidaan esittää binäärilaskennassa lisäämällä luvun esitysmuotoon yksi bitti, merkkibitti, jonka toinen arvo tarkoittaa positiivista lukua ja toinen arvo negatiivista lukua. Tällöin kuitenkin positiivisten ja negatiivisten lukujen yhteenlasku täytyy käsitellä erikoistapauksena ja muuttaa se esimerkiksi tarvittaessa vähennyslaskuksi. Esimerkiksi +3 + -3 täytyy muuttaa vähennyslaskuksi 3 - 3. Ei ole myöskään kovin yksinkertaista käsitellä negatiivisia tuloksia antavia laskutoimituksia.

Yhden komplementti
------------------

Yksinkertaisempaa on muuttaa negatiivisten lukujen bitit vastakkaisiksi (ykkönen nollaksi ja päinvastoin) eli luvun yhden komplementiksi. Tällöin yhteenlasku voidaan laskea samalla tavalla positiivisille ja negatiivisille luvuille. Esimerkiksi +3 + -3 on kolmen bitin yhden komplementtiluvuilla esitettynä:

```
  011
 +100
 ----
  111

```

Esimerkistä huomaa erään yhden komplementin esitysmuodon ongelman: luvulla nolla on kaksi eri esitysmuotoa: 000 ja 111.

Toinen ongelma on merkkibitin käsittely. Jos etumerkillisten lukujen yhteenlaskusta tulee ylimääräinen muistinumero, se pitää erikseen lisätä tulokseen. Esimerkiksi -1 + -2 = -3:

```
  101
 +110
 ----
 1011 -> 1 + 011 = 100

```

Kahden komplementti
-------------------

Yhden komplementtiin liittyvät ongelmat poistuvat, jos käytetään kahden komplementtia. Tällöin luvun vastaluku saadaan kääntämällä luvun bitit ja lisäämällä tulokseen yksi. Kahden komplementtijärjestelmässä luvulla nolla on yksikäsitteinen esitystapa (bittikuvio, jonka kaikki bitit ovat nollia) ja nollan vastaluku on nolla. Sama yhteenlaskuoperaatio toimii sekä etumerkillisten että etumerkittömien lukujen kanssa.

Esimerkkinä +3 + -3 on kolmen bitin kahden komplementtiluvuilla esitettynä:

```
  011
 +101
 ----
 1000

```

Kun kolmen bitin tilan ylittävä bitti (1) jätetään pois, tulos on 000 eli nolla.

Kahden komplementtiluvuissa on aina yksi negatiivinen luku enemmän kuin on positiivisia lukuja (pois lukien luku 0). Esimerkiksi kolmella bitillä esitettävät luvut ovat:

```
 011  3
 010  2
 001  1
 000  0
 111 -1
 110 -2
 101 -3
 100 -4

```

Tyypillisiä lukualueita ovat

* -128..127 (8-bittiset luvut)
* -32768..32767 (16-bittiset luvut)

Käytännöllisesti katsoen kaikki nykyiset tietokoneet käyttävät kahden komplementtilukuja negatiivisten lukujen esittämiseen. Muutama varhain suunniteltu tietokone käytti yhden komplementtia, esimerkiksi PDP-1 ja Univac/1100.

Katso myös
----------

* Liukuluku

Lähteet
-------

1. ↑  Stephen H. Kaisler: *The Univac Corporation: In From The Beginning*, s. 75. Cambridge Scholars Publishing, 2022. ISBN 978-1-5275-7634-6. Teoksen verkkoversio. (englanniksi)
2. ↑  G. M. Amdahl & G. A. Blaauw & F. P. Brooks, Jr.: Architecture of the IBM System / 360 (PDF) *ece.ucdavis.edu*. Viitattu 10.4.2022. (englanniksi)
3. ↑  6. Survey of Signed Integer Representations *open-std.org*. Viitattu 10.4.2022. (englanniksi)