Sa facem acum un exemplu de cod complementar in binar pe numere reprezentate pe 1 octet, ca fiind mai usor de prezentat. Logica functioneaza identic si la reperezentarile pe 2 sau mai multi octeti.
Pe un octet se pot reprezenta 256 de valori, care in cod complementar se distribuie asa:
zecimal binar
-128 10000000
-127 10000001
-126 10000010
... ...
-2 11111110
-1 11111111
0 00000000
1 00000001
2 00000010
... ...
126 01111110
127 01111111
In reprezentare binara numerotarea bitilor se face de la stanga la dreapta incepand cu 0, deci numerotarea pozitiei bitilor pe 1 octet este:
Pozitia 01234567
Valoarea xxxxxxxx
De remarcat ca pe prima pozitie (bitul 0) toate valorile pozitive au valoarea 0 si toate cele negative valoarea 1. Deci valoarea din bitul 0 poate indica semnul numarului si de aceea acest bit este denumit chiar "bit semn". In hardware-ul procesorului acest bit are o functie suplimentara, de
indicator (flag), indicatorul "Semn" (Sign flag), notat
S. Prin testarea acestui indicator stabileste daca un numar este pozitiv (
S = 0) sau negativ (
S = 1). Acesta este unul din argumentele de baza pentru utilizarea codului complementar in forma prezentata.
Orice operatie aritmetica intr-un procesor se face in registrul
"acumulator" (A), eventual in extensiile lui la dreapta. Hardware-ul procesorului pozitioneaza la stanga registrului A un registru de 1 bit, numit "Transport" (Carry), care este si el un indicator (Carry flag), notat cu
C. A nu se confunda
indicatorul C cu
registrul C al procesorului. Ca urmare, situatia hardware este asa:
C SxxxxxxxNotiunea de transportExemplu in sistemul zecimal. Sa se adune numerele 37 cu 45. "In mintea noastra" (adica algoritmul) este asa:
7 + 5 = 12, "scriem 2" si "tinem 1". Acest 1 "tinut" este
transportul.
Transportul se adauga la unitatea de rang superior. Ca urmare, adunarea noastra continua cu:
3 + 4 + 1 = 8, deci rezultatul este 37 + 45 = 82.
Cat poate fi transportul ?
Exemplu zecimal (la limita) cu doua pozitii: 99 + 99 = 198, pe pozitia unitatilor avem 9 + 9 = 18, unde 1 este transportul, iar pe pozitia zecilor avem 9 + 9 + 1 = 19, unde 1 este din nou transportul.
Datorita faptului ca in orice sistem de numeratie suma a doua numere de pe o pozitie impreuna cu transportul din pozitia precedenta este mai mica decat doua unitati de ordin superior, transportul nu poate fi decat 0 sau 1. Acesta este un alt argument pentru utilizarea sistemului de numeratie binar (transportul este saturat).
Cu transportul (valorile T), logica hardware a unui procesor este:
Pozitia 01234567
Transportul T TTTTTTT-
Valoarea C Sxxxxxxx
De remarcat ca pe ultima pozitie (aici 7) nu poate exista transport.
Depasirea binaraDaca in timpul unei operatii de adunare binara rezultatul nu poate fi reprezentat in acumulator se spune ca apare
depasirea binara.
Sa vedem cum functioneaza operatia de adunare si cum se depisteaza erorile de depasire binara.
In relatiile urmatoare:
" < " inseamna "mai mic"
" <= " inseamna "mai mic sau egal"
" >= " inseamna "mai mare sau egal"
" > " inseamna "mai mare".
La adunarea a doua numere
a si
b sunt posibile 6 cazuri (toate exemplele pe 1 octet):
Cazul 1. a >= 0, b >= 0, a + b < 128, suma este reprezentabila,
nu exista depasire.
Exemplu: a = 58, b = 27, a + b = 85
Pozitia C S1234567
a 00111010
b 00011011
Transport 0 0111010-
a + b 01010101
Exemplu la limita: a = 100, b = 27, a + b = 127
Pozitia C S1234567
a 01100100
b 00011011
Transport 0 0000000-
a + b 01111111
In ambele cazuri transporturile in C si S sunt 0 (nu exista transport nici in S, nici in C).
Cazul 2. a > 0, b > 0, a + b >= 128, suma
nu este reprezentabila,
exista depasire.
Exemplu: a = 100, b = 58, a + b = 158
Pozitia C S1234567
a 01100100
b 00111010
Transport 0 1100000-
a + b 10011110
Exemplu la limita: a = 100, b = 28, a + b = 128
Pozitia C S1234567
a 01100100
b 00011100
Transport 0 1111100-
a + b 10000000
In ambele cazuri transporturile in C sunt 0 si in S sunt 1 (exista transport in S, dar nu si in C).
Cazul 3. a >= 0, b < 0, 0 <= a + b < 128, suma este reprezentabila,
nu exista depasire.
Exemplu: a = 100, b = -27, a + b = 73
Pozitia C S1234567
a 01100100
b 11100101
Transport 1 1100100-
a + b 01001001
Transporturile in C si S sunt 1 (exista transport si in S, si in C).
Cazul 4. a >= 0, b < 0, -128 <= a + b < 0, suma este reprezentabila,
nu exista depasire.
Exemplu: a = 27, b = -100, a + b = -73
Pozitia C S1234567
a 00011011
b 10011100
Transport 0 0011000-
a + b 10110111
Transporturile in C si S sunt 0 (nu exista transport nici in S, nici in C).
Cazul 5. a < 0, b < 0, a + b >= -128, suma este reprezentabila,
nu exista depasire.
Exemplu: a = -57, b = -28, a + b = -85
Pozitia C S1234567
a 11000111
b 11100100
Transport 1 1000100-
a + b 10101011
Exemplu la limita: a = -100, b = -28, a + b = -128
Pozitia C S1234567
a 10011100
b 11100100
Transport 1 1111100-
a + b 10000000
In ambele cazuri transporturile in C si in S sunt 1 (exista transport si in S, si in C).
Cazul 6. a < 0, b < 0, a + b < -128, suma
nu este reprezentabila,
exista depasire.
Exemplu: a = -100, b = -57, a + b = -157
Pozitia C S1234567
a 10011100
b 11000111
Transport 1 0011100-
a + b 01100011
Exemplu la limita: a = -100, b = -29, a + b = -129
Pozitia C S1234567
a 10011100
b 11100011
Transport 1 0000000-
a + b 01111111
In ambele cazuri transporturile in C sunt 1 si in S sunt 0 (nu exista transport in S, dar exista in C).
Analizand cele 6 cazuri de mai sus rezulta ca depasirea binara poate fi depistata analizand transporturile in indicatorii C si S printr-o operatie de "sau exclusiv" (XOR):
- daca
transportul in C XOR
transportul in S = 0 nu exista depasire;
- daca
transportul in C XOR
transportul in S = 1 exista depasire.
Toate aceste verificari se realizeaza prin hardware.
La reprezentarea pe 2 sau mai multi octeti urmatorii octeti largesc doar domeniul valorilor reprezentabile, dar nu aduc nimic in plus la logica depasirii binare.
Teoria matematica a codului complementar, in limba romana, o gasiti formalizata perfect si de neinteles

in cartea:
Al. Teodorescu, I. Catona, C. Popescu - "Sistemul FELIX C-256 - limbajul ASSIRIS", Editura Academiei RSR (Wow !), Bucuresti 1974.
Este singura parte a cartii care mai este de actualitate. Din pacate cartea nu contine exemple, asa ca aici v-am facut sistematizarea materiei si exemplele.
Pentru curiosi, limbajul ASSIRIS inseamna ASamblorul Sistemului (de calcul, francez) IRIS.
IRIS inseamna "Informatique et Réseaux pour l'Industrie et les Services" (Informatica si Retele pentru Industrie si Servicii).
Sistemele de calcul IRIS au fost fabricate in Romania sub numele "FELIX C-32", "FELIX C-256" si "FELIX C-512".
----
Ei, acum sper ca sunteti de acord cu mine ca sistemul de numeratie binar este o minune si cel zecimal o idiotie provenita din cele 10 degete ale noastre. Mai bine aveam 8, cate 4 la fiecare mana
