Kiegészítő kód

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. január 31-én felülvizsgált verziótól ; az ellenőrzések 22 szerkesztést igényelnek .

A kettős komplementer ( néha  " kettes - komplement" ) a legáltalánosabb módja a negatív egész számok ábrázolásának a számítógépekben . Lehetővé teszi, hogy a kivonás műveletét az összeadás műveletével helyettesítse, és az összeadás és a kivonás műveletei azonosak legyenek előjeles és előjel nélküli számoknál, ami leegyszerűsíti a számítógép architektúráját . Az angol irodalomban a " fordított kódot " " egyesek"-nek , a "kiegészítő kódot" pedig "kettő komplementernek" nevezik .  

A negatív számhoz további kódot kaphatunk, ha megfordítjuk a bináris modulusát, és hozzáadunk egyet az inverzióhoz, vagy kivonjuk a számot nullából.
A kettő komplement kódja az az érték, amelyet úgy kapunk, hogy kivonjuk a számot a kettő legnagyobb hatványából ( az N bites másodperc komplementerének 2 N -jából).

Egy negatív szám kettes komplementereje

Ha számot írunk egy további kódba, a legjelentősebb bit egy előjel. Ha a legjelentősebb bit értéke 0, akkor ez azt jelenti, hogy a fennmaradó bitek pozitív bináris számot tartalmaznak, amely megegyezik a közvetlen kóddal .

A kettős komplementer előjelű 8 bites bináris szám bármilyen egész számot jelenthet -128 és +127 között . Ha a legjelentősebb bit nulla, akkor a maradék 7 bitbe írható legnagyobb egész szám a .

Példák:

Tizedes
ábrázolás
Bináris ábrázolás (8 bit), kód:
egyenes vissza további
127        0111 1111        0111 1111        0111 1111       
egy        0000 0001        0000 0001        0000 0001       
0        0000 0000        0000 0000        0000 0000       
-0        1000 0000        1111 1111       
-egy        1000 0001        1111 1110        1111 1111       
-2        1000 0010        1111 1101        1111 1110       
-3        1000 0011        1111 1100        1111 1101       
- négy        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       
-nyolc        1000 1000        1111 0111        1111 1000       
-9        1000 1001        1111 0110        1111 0111       
-tíz        1000 1010        1111 0101        1111 0110       
-tizenegy        1000 1011        1111 0100        1111 0101       
-127        1111 1111        1000 0000        1000 0001       
-128        ---        ---        1000 0000       

Kiegészítő kód egy másik számrendszerben

Ugyanez az elv bármely számrendszer számítógépes ábrázolásánál is használható , például decimális számoknál .

Transzformációk a decimális számrendszer példáján [1]

Pozitív szám

A szám aktuális számjegyeinek értéke nem változik, hanem az előjel legjelentősebb számjegye kerül hozzáadásra, amelynek értéke 0. Például a [+12'345] szám a következőképpen jelenik meg - [012'345 ]

Negatív szám

A számrendszer legnagyobb számjegyével egyenlő előjelet adunk , esetünkben ez 9, és egy bizonyos szabály szerint változtatjuk meg a fennmaradó számjegyeket; az egyes számjegyek számjegyének értékét az előjel kivételével x változóval ábrázoljuk, majd képzeljük el a következő műveleti algoritmust:

  1. Rendeljen az x változóhoz egy új értéket, amely megegyezik a 9 - x kifejezéssel (a fordított kód megszerzésének folyamata) - például egy negatív szám [ -12345 ] a közvetlen kódban a legjelentősebbtől a legkevésbé jelentős számjegyig fog kinézni [9' 12345 ], ahol a 9 egy előjelű számjegy, és a kód fordított ábrázolása így fog kinézni - [9'87654].
  2. A kapott számhoz 1-et adunk, így a [9'87654] szám (első hozzáadás) így fog kinézni: [987'655] (további kód).
  3. Ha olyan bitátviteli helyzet állt elő, aminek következtében új bit keletkezett, akkor azt (a legmagasabb bitet) kihagyjuk, és a kapott számot pozitívnak tekintjük. Az eredményül kapott pozitív szám egyenlően jelenik meg, mind a közvetlen, mind a kettős komplementer kódban. Például, mivel képes a negatív és pozitív nulla megjelenítésére ebben a formában, elemezzük ezek fordítását egy további kódba (1 jel és 4 további számjegy):
    • [+0] a [0'0000] közvetlen kódban. Az első és a második kiegészítés értéke [0'0000].
    • [-0] közvetlen kódban [9'0000]. Az első kiegészítés a [9'9999]. A második komplement vételekor a [(1)0'0000] szám magas bitje kimarad, és a kapott [0'0000] értéket kapjuk, mint a [+0] számnál.

A tizedes (valamint bármely más) szám kettős komplementer kódban való ábrázolásának ötlete megegyezik a kettes számrendszer szabályaival, és használható egy hipotetikus processzorban:

Szokásos

teljesítmény

Egyenes

a kód

Első

kiegészítés

Második

kiegészítés

... ... ... ...
+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
-egy 9'0001 9'9998 9'9999
-2 9'0002 9'9997 9'9998
-3 9'0003 9'9996 9'9997
- négy 9'0004 9'9995 9'9996
... ... ... ...
-9 9'0009 9'9990 9'9991
-tíz 9'0010 9'9989 9'9990
-tizenegy 9'0011 9'9988 9'9989
-12 9'0012 9'9987 9'9988
-13 9'0013 9'9986 9'9987

Kettős komplemens aritmetika

Összeadás és kivonás

Mindkét szám a kettő komplementerében van ábrázolva. Mindkét szám kiegészítő kódja ugyanannyi számjegyből áll. Ebben az ábrázolásban a számok összeadódnak.

Az előjelek eltérőek: Ha az összeadás során a kezdeti számokon túlmutató számjegy keletkezik, akkor az kimarad. A kapott értéket akkor tekintjük pozitívnak , ha a közvetlen és a kettes komplement kód azonos. Ellenkező esetben negatív egy további kód formájában .

Például:

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

A jelek ugyanazok:

  • pozitív számok. A váladék nem esik, az eredmény pozitív.
  • Negatív számok. A számjegy kimarad, az eredmény negatív a kettő komplementer kódjában.

Például:

  • [1234] + [78] → [0'1234] + [0'0078] = [0'1312] = [1312].
  • [-1234] + [-78] → [9'8766] + [9'9922] = [(1)9'8688] → (első komplementer) [0'1311] → (második komplement vagy reguláris reprezentáció) [0 '1312]. Ha kettős komplementerről normál reprezentációra fordítjuk, a kapott érték abszolút.

Konvertálás kettős komplementerre

Egy szám átalakítása közvetlen kódból további kódba a következő algoritmus szerint történik.

  1. Ha a direkt kódba írt szám legjelentősebb (előjel) bitje 0, akkor a szám pozitív és nem történik transzformáció;
  2. Ha a direkt kódba írt szám legjelentősebb (előjel) jegye 1, akkor a szám negatív, a szám minden számjegye az előjel kivételével invertálódik , és az eredményhez hozzáadódik az 1.

Példa. A közvetlen kódba írt negatív −5 számot alakítsuk át egy további kóddá. Közvetlen kód negatív számhoz -5:

1000 0101

A szám minden számjegyét megfordítjuk, kivéve az előjelet, így megkapjuk a -5 negatív szám inverz kódját (első összeadását):

1111 1010

Adjunk hozzá 1-et az eredményhez, így megkapjuk a -5 negatív szám kiegészítő kódját (második komplementerét):

1111 1011

Hasonló algoritmussal alakítják át a kettő komplementer kódjába írt negatív -5 számot a közvetlen kódba írt pozitív 5 számmá. Ugyanis:

1111 1011

A -5 negatív szám összes számjegyét megfordítjuk, így a közvetlen kódban pozitív 4-es számot kapunk:

0000 0100

Ha az eredményhez hozzáadunk 1-et, a közvetlen kódban pozitív 5-ös számot kapunk:

0101

És ellenőrizze további kód hozzáadásával

0000 0101 + 1111 1011 = 0000 0000, az ötödik és magasabb számjegyek el lesznek vetve.

p-adic számok

A p -adikus számok rendszerében egy szám előjelének megváltoztatása a szám további kódjává történő átalakításával történik. Például, ha a számrendszer 5, akkor a 0001 5 (1 10 ) ellentéte 4444 5 (−1 10 ).

A kettő komplement konverziós algoritmusának megvalósítása (8 bites számokhoz)

Pascal

ha ( a < 0 ) akkor a := ( ( nem a ) vagy 128 ) + 1 ;

C/C++

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

Előnyök és hátrányok

Előnyök

  • Általános (processzoros) utasítások összeadáshoz, kivonáshoz és balra toláshoz előjeles és előjel nélküli számokhoz (csak a számtani jelzőkben van eltérés, amit ellenőrizni kell az eredmény túlcsordulásának szabályozásához).
  • A " mínusz nulla " szám hiánya .

Hátrányok

  • Egy negatív szám ábrázolását nem a megszokott szabályok szerint olvassuk vizuálisan, érzékelése speciális készségeket vagy további számításokat igényel, hogy normális formába kerüljön.
  • Egyes ábrázolásokban (például BCD ) vagy azok összetevőiben (például egy lebegőpontos szám mantisszája ) az extra kódolás kényelmetlen.
  • A legnagyobb szám modulusa nem egyenlő a legkisebb szám modulusával. Például egy nyolcbites előjelű egész szám esetén a maximális szám 127 10 = 01111111 2 , a minimális szám pedig -128 10 = 10000000 2 . Ennek megfelelően egyetlen számnak sincs ellentéte. A jelcsere művelet további ellenőrzést igényelhet.

Példa automatizált konverzióra

Ha olyan fájlból vagy memóriaterületről olvas adatokat, ahol azok kettes kiegészítésben vannak tárolva (például egy WAVE fájl), akkor szükség lehet a bájtok konvertálására. Ha az adatok 8 bitben vannak tárolva, a 128-255 értékeknek negatívnak kell lenniük.

C# .NET / C stílus

b1 bájt = 254 ; //11111110 (bináris) b2 bájt = 121 ; //01111001 (bináris) bájt c = 1 <<( sizeof ( byte )* 8 - 1 ); //2-t 7 hatványára emeljük. Eredmény: 10000000 (bináris) bájt b1Conversion =( c ^ b1 ) - c ; //Eredmény: -2. És valójában egy bináris kettős komplemens kód. b2 bájt Konverzió =( c ^ b2 ) - c ; //Az eredmény 121 marad, mert az előjelbit nulla.

Jelölje ki a bővítményt

Jelkiterjesztés (eng. Sign extension ) - egy bináris számon végzett művelet, amely lehetővé teszi a bitek számának növelését az előjel és az érték megőrzése mellett. Ezt úgy hajtják végre, hogy a legjelentősebb számjegyből adják hozzá a számjegyeket. Ha a szám pozitív (a legjelentősebb számjegy 0), akkor nullákat, ha negatív (a legjelentősebb számjegy 1), akkor egyeseket.

Példa

Decimális szám bináris szám

(8 számjegy)

bináris szám

(16 számjegy)

tíz 0000 1010 0000 0000 0000 1010
−15 1111 0001 1111 1111 1111 0001

Lásd még

Irodalom

  • Behrooz Parhami. 2.3. Kiegészítő ábrázolás, 2.4. Kettős és 1-es komplementszámok // Számítógépes aritmetika: Algoritmusok és hardvertervek . - New York: Oxford University Press, 2000. - P. 22-27. — 510 p. — ISBN 0-19-512583-5 .
  • Szamofalov K.G., Romankevics A.M., Valujszkij V.N., Kanevszkij Yu.S., Pinevics M.M. A digitális automaták alkalmazott elmélete. - K . : Vishcha iskola, 1987. - 375 p.

Linkek

  1. Florida Tech . Letöltve: 2020. november 28. Az eredetiből archiválva : 2016. október 8..