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).
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 |
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 .
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ámA 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:
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 |
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:
A jelek ugyanazok:
Például:
Egy szám átalakítása közvetlen kódból további kódba a következő algoritmus szerint történik.
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 0101A 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 1010Adjunk 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 1011Hasonló 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 1011A -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 0100Ha 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.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 ).
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.
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.
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 |