Dodatni kod

Iz Wikipedije, slobodne enciklopedije

Idi na navigaciju Idi na pretragu

Dodatni kod ( engleski "two's complement" , ponekad "twos-complement" ) je najčešći način predstavljanja negativnih cijelih brojeva u računarima . Omogućava vam da zamijenite operaciju oduzimanja operacijom sabiranja i učinite operacije sabiranja i oduzimanja istim za brojeve s predznakom i bez predznaka , što pojednostavljuje arhitekturu računara . U engleskoj literaturi " povratni kod " se naziva "adiciona jedinica" ( eng. "Ones' complement"), a "dodatni kod" se odnosi na "dopunu dva" ( eng. "Two's complement").

Komplementarni kod za negativan broj može se dobiti invertiranjem njegovog binarnog modula i dodavanjem jedan inverznom, ili oduzimanjem broja od nule.
Binarni komplementarni kod se definiše kao vrednost dobijena oduzimanjem broja od najvećeg stepena dvojke (od 2 N za N-bitni komplement sekunde).

Reprezentacija komplementa negativnih dvojaka

Prilikom pisanja broja u kodu komplementa dva, najznačajniji bit se potpisuje. Ako je njegova vrijednost 0, tada se u ostatku cifara upisuje pozitivan binarni broj , koji se poklapa s direktnim kodom .

Binarni 8-bitni predpisani cijeli broj u komplementu dva može biti bilo koji cijeli broj u rasponu od -128 do +127. Ako je najznačajniji bit nula, tada je najveći cijeli broj koji se može zapisati u preostalih 7 bita ...

primjeri:

Decimala
performanse
Binarni prikaz (8 bita), kod:
ravno nazad dodatno
127 0111 1111 0111 1111 0111 1111
1 0000 0001 0000 0001 0000 0001
0 0000 0000 0000 0000 0000 0000
-0 1000 0000 1111 1111
-1 1000 0001 1111 1110 1111 1111
-2 1000 0010 1111 1101 1111 1110
-3 1000 0011 1111 1100 1111 1101
-4 1000 0100 1111 1011 1111 1100
-5 1000 0101 1111 1010 1111 1011
-6 1000 0110 1111 1001 1111 1010
-7 1000 0111 1111 1000 1111 1001
-osam 1000 1000 1111 0111 1111 1000
-devet 1000 1001 1111 0110 1111 0111
-deset 1000 1010 1111 0101 1111 0110
-jedanaest 1000 1011 1111 0100 1111 0101
-127 1111 1111 1000 0000 1000 0001
-128 --- --- 1000 0000

Dodatni kod u drugom sistemu brojeva

Isti princip se može koristiti u kompjuterskom predstavljanju bilo kojeg brojevnog sistema, na primjer, za decimalne brojeve .

Pretvorbe na primjeru decimalnog brojevnog sistema [1]

Pozitivan broj

Promjena vrijednosti trenutnih cifara broja se ne vrši, već se dodaje potpisani najznačajniji bit, čija je vrijednost 0. Na primjer, broj [+ 12'345] će imati sljedeći prikaz - [ 012'345]

Negativan broj

Predznaku najznačajniju cifru dodamo jednaku većoj cifri datog brojevnog sistema , u našem slučaju to je 9, a takođe menjamo preostale cifre prema određenom pravilu; neka vrijednost cifre svake cifre bude predstavljena promjenljivom x , osim one s predznakom, tada predstavljamo sljedeći algoritam radnji:

  1. Dodijelimo varijablu x novu vrijednost jednaku izrazu 9 - x (proces dobijanja obrnutog koda) - na primjer, negativan broj [ -12345 ] u direktnom kodu od najznačajnijeg do najmanje značajnog bita će imati oblik [9 ' 12345 ], gdje je 9 cifra s predznakom, au obrnutom prikazu koda će biti kako slijedi - [9'87654].
  2. Dodajte 1 rezultirajućem broju, tako da će broj [9'87654] (prvi dodatak) izgledati kao [987'655] (dodatni kod).
  3. Ako je nastala situacija prijenosa pražnjenja, uslijed čega je nastao novi pražnjenje, tada ga izostavljamo (najznačajnije pražnjenje), a rezultirajući broj se smatra pozitivnim. Rezultirajući pozitivan broj će biti predstavljen identično u direktnom i komplementarnom kodu dvojke. Na primjer, imajući priliku da u ovom obliku predstavimo negativnu i pozitivnu nulu, analizirajmo njihov prijevod u dodatni kod (1 znak i 4 dodatne znamenke):
    • [+0] u direktnom kodu [0'0000]. Prvi i drugi komplement su jednaki [0'0000].
    • [-0] u direktnom kodu [9'0000]. Prvi dodatak je [9'9999]. Prilikom primanja drugog komplementa, izostavljamo najznačajniji bit broja [(1) 0'0000] i dobijamo rezultujuću vrijednost [0'0000], kao u broju [+0].

Ideja predstavljanja decimalnog (kao i svakog drugog) broja u komplementu dva identična je pravilima za binarni brojevni sistem i može se koristiti u hipotetičkom procesoru:

Habitual

performanse

Pravo

kod

Prvo

dodatak

Sekunda

dodatak

... ... ... ...
+13 0'0013 0'0013 0'0013
+12 0'0012 0'0012 0'0012
+11 0'0011 0'0011 0'0011
+10 0'0010 0'0010 0'0010
+9 0'0009 0'0009 0'0009
+8 0'0008 0'0008 0'0008
... ... ... ...
+2 0'0002 0'0002 0'0002
+1 0'0001 0'0001 0'0001
+0 0'0000 0'0000 0'0000
-0 9'0000 9'9999 0'0000
-1 9'0001 9'9998 9'9999
-2 9'0002 9'9997 9'9998
-3 9'0003 9'9996 9'9997
-4 9'0004 9'9995 9'9996
... ... ... ...
-devet 9'0009 9'9990 9'9991
-deset 9'0010 9'9989 9'9990
-jedanaest 9'0011 9'9988 9'9989
-12 9'0012 9'9987 9'9988
-13 9'0013 9'9986 9'9987

Aritmetika komplementa dva

Sabiranje i oduzimanje

Oba broja su predstavljena u komplementarnom kodu dva. Komplementarni kod oba broja ima isti broj cifara. U ovom prikazu, brojevi se sabiraju.

Znakovi su različiti: ako se u procesu sabiranja formira pražnjenje koje nadilazi originalne brojeve, onda se izostavlja. Rezultirajuća vrijednost se smatra pozitivnom ako su prosljedni i komplementarni kodovi identični. Inače - negativan u obliku dodatnog koda .

Na primjer:

  • [1234] + [-78] → [0'1234] + [9'9922] = [(1) 0'1156] = [1156].
  • [-1234] + [78] → [9'8766] + [0'0078] = [9'8844] = [-1156].

Znakovi su isti:

  • Pozitivni brojevi. Iscjedak ne pada, rezultat je pozitivan.
  • Negativni brojevi. Cifra je izostavljena, rezultat je negativan u komplementu dva.

Na primjer:

  • [1234] + [78] → [0'1234] + [0'0078] = [0'1312] = [1312].
  • [-1234] + [-78] → [9'8766] + [9'9922] = [(1) 9'8688] → (prvi komplement) [0'1311] → (drugi komplement ili regularna reprezentacija) [0 '1312]. Kada se prevede iz komplementarnog koda u normalnu reprezentaciju, rezultirajuća vrijednost je apsolutna.

Pretvaranje u komplementarni kod

Konverzija broja iz direktnog koda u dodatni vrši se prema sljedećem algoritmu.

  1. Ako je najznačajniji (predpisani) bit broja napisan u direktnom kodu 0, tada je broj pozitivan i nema konverzije;
  2. Ako je najznačajniji (predpisani) bit broja koji je napisan u direktnom kodu 1, tada je broj negativan, sve cifre broja, osim predznačenog , su obrnute , a rezultatu se dodaje 1.

Primjer. Pretvorite negativni direktno kodirani broj −5 u njegov komplement. Direktan kod negativan broj -5:

 1000 0101 

Invertiramo sve cifre broja, osim predznaka, i tako dobijemo inverzni kod (prvi komplement) negativnog broja -5:

 1111 1010

Dodajte 1 rezultatu i tako dobijete komplementarni kod (drugi komplement) negativnog broja -5:

 1111 1011

Sličan algoritam se koristi za pretvaranje negativnog broja komplementa dvojke -5 u pozitivan direktan broj 5. naime:

 1111 1011

Invertujemo sve znamenke negativnog broja -5, tako da dobijemo pozitivan broj 4 u direktnom kodu:

 0000 0100

Dodavanjem 1 rezultatu dobijamo pozitivan broj 5 u direktnom kodu:

 0101

I provjerite dodavanjem dodatnog koda

 0000 0101 + 1111 1011 = 0000 0000, peta i više cifre se odbacuju.

p-adični brojevi

U sistemu p- adičnih brojeva, predznak broja se menja pretvaranjem broja u njegov komplementaran kod. Na primjer, ako se koristi 5-redni brojevni sistem, suprotno od 0001 5 (1 10 ) je 4444 5 (−1 10 ).

Implementacija algoritma za konverziju u komplementarni kod (za 8-bitne brojeve)

Pascal

 ako ( a < 0 ) onda
    a : = (( ne a ) ili 128 ) + 1 ;

C / C ++

 int convert ( int a ) {
ako ( a < 0 )
a = ~ ( - a ) + 1 ;
return a ;
}

Prednosti i nedostaci

Prednosti

  • Generičke (procesorske) instrukcije za sabiranje, oduzimanje i pomak ulijevo za brojeve s predznakom i bez predznaka (jedina razlika je u aritmetičkim zastavicama koje je potrebno provjeriti da bi se kontroliralo prelivanje u rezultatu).
  • Odsustvo broja " minus nula ".

nedostatke

  • Reprezentacija negativnog broja nije vizualno čitljiva prema uobičajenim pravilima, za njegovu percepciju potrebna vam je posebna vještina ili dodatni proračuni da biste ga doveli u normalan oblik.
  • U nekim reprezentacijama (na primjer, binarni decimalni kod ) ili njihovim sastavnim dijelovima (na primjer, mantisa broja s pomičnim zarezom ), dodatno kodiranje je nezgodno.
  • Modul najvećeg broja nije jednak modulu najmanjeg broja. Na primjer, za osmobitni predpisani cijeli broj, maksimalni broj je 127 10 = 01111111 2 , minimalni broj je -128 10 = 10000000 2 . Prema tome, suprotnost ne postoji za svaki broj. Operacija promjene znaka može zahtijevati dodatnu provjeru.

Primjer programske konverzije

Ako čitate podatke iz datoteke ili područja memorije gdje su pohranjeni u komplementarnom kodu (na primjer, WAVE datoteka), možda će biti potrebno pretvoriti bajtove. Ako su podaci pohranjeni u 8 bita, vrijednosti 128-255 moraju biti negativne.

C # .NET / C stil

 bajt b1 = 254 ; // 11111110 (binarni)
bajt b2 = 121 ; // 01111001 (binarni)
bajt c = 1 << ( sizeof ( byte ) * 8 - 1 ); // 2 se diže na stepen 7. Rezultat: 10000000 (binarni)
bajt b1Konverzija = ( c ^ b1 ) - c ; // Rezultat: -2. U stvari, binarni komplement.
bajt b2Konverzija = ( c ^ b2 ) - c ; // Rezultat ostaje 121 jer je bit predznaka nula.

Sign ekstenzija

Proširenje znaka je operacija na binarnom broju koja vam omogućava da povećate broj cifara broja uz očuvanje znaka i vrijednosti. Izvodi se sabiranjem cifara sa strane najznačajnije cifre. Ako je broj pozitivan (najznačajniji bit je 0), dodaju se nule, ako je negativan (najznačajniji bit je 1) - jedinice.

Primjer

Decimala Binarni broj

(8 cifara)

Binarni broj

(16 bit)

deset 0000 1010 0000 0000 0000 1010
−15 1111 0001 1111 1111 1111 0001

vidi takođe

Književnost

Linkovi

  1. Florida Tech