Une façon de voir le complément à 2, c'est que ça permet d'avoir une seule instruction d'addition qui marche aussi bien sur les nombres signés que non signés.
Avec des nombres non signés, l'addition fonction modulo 2^n sur l'intervalle [0, 2^n-1]. Exemple : tu prends un ruban en papier, fais 16 cases numérotées de 0 à 15, et tu scotches les bouts ensemble pour faire un cylindre.
En complément à 2, on va garder la même représentation pour les nombres de 0 à 2^(n-1)-1 parce que ça nous arrange, mais on interprète les autres comme des négatifs entre -2^(n-1) et -1. Exemple, tu reprends ton cylindre, mais cette fois tu re-numérotes à reculons en partant de zéro : -1 à la place de 15, -2 à la place de 14, jusqu'à l'extrémité opposée (entre -8 et 7).
Tant que tu restes dans les nombres représentables, ton algo d'addition sur le cylindre est le même pour les signés et non signés.
Pour les débordements : tu marques l'emplacement du bout de scotch avec un C (Carry) et le trait entre -8 et 7 de l'autre côté avec un O (Overflow). Quand tu fais une addition, si tu passes le trait C tu le notes dans un coin, si tu passes le trait O aussi.
C et O sont des signaux en sortie de l'additionneur, qui sont mémorisés comme bits dans le registre de drapeaux (flags) dans la plupart des processeurs. Donc si tu veux savoir s'il y a eu un overflow (en complément à 2) tu testes le flag O, si tu veux savoir s'il y a eu une retenue (en unsigned) tu testes le flag C.
Sinon tu peux balancer ces questions dans le topic de la prog, hein. Ça fera de mal à personne de réviser le complément à 2 et ça permettra à d'autre de répondre aussi.