<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="it" lang="it">
<head>
<title>Complemento a due</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="Complemento_a_due"/>
<meta name="wx_page_id" content="143385"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="Complemento a due" id="wxsec1"><h1 class="pagetitle" id="wx1">Complemento a due</h1>

<p id="wx2">Il <b id="wx3">complemento a due</b> ( in inglese <b id="wx4">Two's complement</b>) è il metodo più diffuso per la <a href="/wit/Rappresentazione_dei_numeri_relativi" title="Rappresentazione dei numeri relativi" wx:linktype="known" wx:pagename="Rappresentazione_dei_numeri_relativi" wx:page_id="588215" id="wx5">rappresentazione dei numeri relativi</a> in <a href="/wit/Informatica" title="Informatica" wx:linktype="known" wx:pagename="Informatica" wx:page_id="1681180" id="wx6">informatica</a>. Esso è inoltre una operazione di negazione (cambiamento di segno) nei computer che usano questo metodo. La sua enorme diffusione è data dal fatto che i circuiti di addizione e sottrazione non devono esaminare il segno di un numero rappresentato con questo sistema per determinare quale delle due operazioni sia necessaria, permettendo tecnologie più semplici e maggiore precisione.</p>

<p id="wx7">Col complemento a due, il bit iniziale (più a sinistra) del numero ne indica il segno: se è 0, il numero è un <a href="/wit/Sistema_numerico_binario" title="Sistema numerico binario" wx:linktype="known" wx:pagename="Sistema_numerico_binario" wx:page_id="8662" id="wx8">numero binario</a> in forma normale; se è 1, il numero è negativo, e se ne ottiene il valore assoluto complementando (invertendo) il valore dei singoli bit e aggiungendo 1 al numero binario risultante.</p>

<p id="wx9">Un numero binario di <i id="wx10">n</i> cifre può rappresentare con questo metodo i numeri compresi fra -2<sup id="wx11">n-1</sup> e +2<sup id="wx12">n-1</sup>-1, così un binario di 8 cifre può rappresentare i numeri compresi tra -128 e +127.</p>

<p id="wx13">Da notare che esiste una sola rappresentazione dello zero: quando tutti i bit sono zero.</p>

<p id="wx14">Questo metodo consente di avere un'unica rappresentazione dello zero, e di operare efficientemente addizione e sottrazione sempre avendo il primo bit a indicare il segno.</p>

<div id="wx_toc"/>

<a id="Calcolo_del_complemento_a_due" name="Calcolo_del_complemento_a_due"/>
<wx:section level="2" title="Calcolo del complemento a due" id="wxsec2"><h2 id="wx15">Calcolo del complemento a due</h2>

<p id="wx16">Per rappresentare il complemento a due di un numero binario se ne invertono, o negano, i singoli bit: si applica cioè l'<a href="/wit/Operazione_logica" title="Operazione logica" wx:linktype="known" wx:pagename="Operazione_logica" wx:page_id="1226119" id="wx17">operazione logica</a> NOT. Si aggiunge infine 1 al valore del numero trovato con questa operazione.</p>

<p id="wx18">Facciamo un esempio rappresentando il numero -5 con 8 bit in complemento a 2:</p>

<pre id="wx19">
0000 0101 (5)
</pre>

<p id="wx20">Partiamo dalla rappresentazione in binario del numero 5. La prima cifra è 0, quindi il numero è sicuramente positivo. Invertiamo i bit: 0 diventa 1, e 1 diventa 0:</p>

<pre id="wx21">
1111 1010 
</pre>

<p id="wx22">A questo punto abbiamo ottenuto il <a href="/wit/Rappresentazione_dei_numeri_relativi" title="Rappresentazione dei numeri relativi" wx:linktype="known" wx:pagename="Rappresentazione_dei_numeri_relativi" wx:page_id="588215" id="wx23">complemento a uno</a> del numero 5; per ottenere il complemento a due aggiungiamo 1 a questo numero:</p>

<pre id="wx24">
1111 1011 (-5)
</pre>

<p id="wx25">Il risultato è un numero binario con segno che rappresenta il numero negativo -5 secondo il complemento a due. Il primo bit, pari a 1, evidenzia che il numero è negativo.</p>

<p id="wx26">Il complemento a due di un numero negativo ne restituisce il numero positivo pari al valore assoluto: invertendo i bit della rappresentazione del numero -5 (sopra) otteniamo:</p>

<pre id="wx27">
0000 0100
</pre>

<p id="wx28">Aggiungendo 1 otteniamo:</p>

<pre id="wx29">
0000 0101
</pre>

<p id="wx30">Che è appunto la rappresentazione del numero +5 in forma binaria.</p>

<p id="wx31">Si noti che il complemento a due dello zero è zero stesso: invertendone la rappresentazione si ottiene un byte di 8 bit pari a 1, e aggiungendo 1 si ritorna a tutti 0 (l'<a href="/wit/Overflow" title="Overflow" wx:linktype="known" wx:pagename="Overflow" wx:page_id="231052" id="wx32">overflow</a> viene ignorato).</p>

<a id="Addizione" name="Addizione"/>
</wx:section><wx:section level="2" title="Addizione" id="wxsec3"><h2 id="wx33">Addizione</h2>

<p id="wx34">Operare l'addizione di due interi rappresentati con questo metodo non richiede processi speciali se essi sono di segno opposto, e il segno viene determinato automaticamente. Facciamo un esempio addizionando 15 e -5:</p>

<pre id="wx35">
 11111 111   (riporto)
  0000 1111  (15)
+ 1111 1011  (-5)
===========
  0000 1010  (10)
</pre>

<p id="wx36">Questo processo gioca sulla lunghezza fissa di 8 bit della rappresentazione: viene ignorato un riporto di 1 che causerebbe un overflow, e rimane il risultato corretto dell'operazione (10).</p>

<p id="wx37">Gli ultimi due bit (da destra a sinistra) della riga dei riporti contengono importanti informazioni sulla validità del risultato: se questo è compreso nell'insieme di numeri rappresentabili con questo sistema o è accaduto un overflow. Questo si è verificato se un riporto è stato eseguito sul bit del segno ma non è stato portato fuori, o viceversa; più semplicemente, se i due bit più a sinistra sulla riga dei riporti non sono entrambi 0 o 1. Per verificare la validità del risultato è conveniente eseguire su questi due bit un'operazione <a href="/wit/Or_esclusivo" title="Or esclusivo" wx:linktype="known" wx:pagename="Or_esclusivo" wx:page_id="253922" id="wx38">EXOR</a>. Vediamo un esempio di addizione a 4 bit di 7 e 3:</p>

<pre id="wx39">
 0111   (riporto)
  0111  (7)
+ 0011  (3)
=============
  1010  (−6)  Il risultato non è valido!
</pre>

<a id="Sottrazione" name="Sottrazione"/>
</wx:section><wx:section level="2" title="Sottrazione" id="wxsec4"><h2 id="wx40">Sottrazione</h2>

<p id="wx41">Anche se la sottrazione potrebbe essere eseguita aggiungendo il complemento a due del sottraendo al minuendo, questo procedimento è poco utilizzato in quanto porta più complicazioni che semplicemente costruire un circuito per la sottrazione. Ma come per l'addizione, il vantaggio del complemento a due è l'eliminazione della necessità di esaminare i segni degli operandi per determinare quale operazione sia necessaria. Per esempio, sottrarre -5 a 15 è come aggiungere 5 a 15, ma questo è nascosto dal complemento a due:</p>

<pre id="wx42">
 11110 000   (riporto)
  0000 1111  (15)
− 1111 1011  (−5)
===========
  0001 0100  (20)
</pre>

<p id="wx43">L'overflow viene individuato con lo stesso metodo usato per l'addizione, esaminando i bit più a sinistra sulla riga dei riporti: se sono differenti si è verificato un overflow.</p>

<p id="wx44">Facciamo un altro esempio con una sottrazione con risultato negativo: 15 − 35 = −20:</p>

<pre id="wx45">
 11100 000   (riporto)
  0000 1111  (15)
− 0010 0011  (35)
===========
  1110 1100  (−20)
</pre>

<a id="Particolarit.C3.A0" name="Particolarit.C3.A0"/>
</wx:section><wx:section level="2" title="Particolarità" id="wxsec5"><h2 id="wx46">Particolarità</h2>

<p id="wx47">A parte una singola eccezione, cercando il complemento a due di ogni numero rappresentato con questo metodo, otteniamo il suo opposto: 5 diventa -5, -12 diventa 12, ecc.</p>

<p id="wx48">Il minor numero rappresentabile (cioè quello negativo con maggior valore assoluto) costituisce l'unica eccezione: vediamo l'esempio del numero -128 nella rappresentazione a 8 bit:</p>

<pre id="wx49">
1000 0000  (−128)
0111 1111  (bit invertiti)
1000 0000  (aggiunto 1)
</pre>

<p id="wx50">Questo perché 127 è il maggior numero con segno rappresentabile con 8 bit. Si noti che viene segnalato un overflow perché c'è un riporto sul bit del segno ma non fuori di esso.</p>

<p id="wx51">Nonostante questo sia un numero unico, la sua rappresentazione è valida. Tutte le operazioni possono funzionare con esso sia come operando che come risultato (a meno che non sia successo un overflow).</p>

<a id="Analisi_matematica" name="Analisi_matematica"/>
</wx:section><wx:section level="2" title="Analisi matematica" id="wxsec6"><h2 id="wx52">Analisi matematica</h2>

<p id="wx53">I 2<sup id="wx54">n</sup> possibili valori degli n bit che vanno a costituire la rappresentazione di un numero intero in forma binaria formano un <a href="/wit/Anello_%28algebra%29" title="Anello (algebra)" wx:linktype="known" wx:pagename="Anello_(algebra)" wx:page_id="33544" id="wx55">anello</a> di classi di equivalenza, ovvero gli interi (<a href="/wit/Aritmetica_modulare" title="Aritmetica modulare" wx:linktype="known" wx:pagename="Aritmetica_modulare" wx:page_id="322141" id="wx56">modulo</a> 2<sup id="wx57">n</sup>). Ciascuna classe rappresenta un insieme {j + k·2<sup id="wx58"><i id="wx59">n</i></sup> | <i id="wx60">k</i> è un intero} per ogni intero j, 0 ≤ j ≤ 2<sup id="wx61">n</sup> − 1. Esistono 2<sup id="wx62">n</sup> insiemi del genere, e l'addizione e la moltiplicazione sono ben definite all'interno di essi.</p>

<p id="wx63">Se le classi sono impiegate per rappresentare i numeri tra 0 e 2<sup id="wx64">n</sup> − 1, e l'overflow viene ignorato, si ha un insieme di interi senza segno; ma ognuno di essi è equivalente a sé stesso meno 2<sup id="wx65">n</sup>. Quindi le classi possono essere intese come la rappresentazione dei numeri tra −2<sup id="wx66">n−1</sup> e 2<sup id="wx67">n−1</sup> − 1, sottraendo 2<sup id="wx68">n</sup> dalla metà di essi.</p>

<p id="wx69">Per semplicità: con 8 bit si possono rappresentare i numeri interi da 0 a 255. Sottraendo 256 alla metà superiore (da 128 a 255) si ottengono i numeri da -128 a -1, e l'insieme totale comprende ora i numeri da -128 a 127, con segno.</p>

<p id="wx70">La relazione col complemento a due è resa evidente dal fatto che 256 = 255 + 1, e che 255 - x è il complemento a uno di x.</p>

<p id="wx71"><b id="wx72">Esempio</b></p>

<p id="wx73">-95 modulo 256 equivale a 161, dal momento che:</p>

<dl id="wx74">
<dd id="wx75">
<p id="wx76">−95 + 256</p>
</dd>

<dd id="wx77">
<p id="wx78">= −95 + 255 + 1</p>
</dd>

<dd id="wx79">
<p id="wx80">= 255 − 95 + 1</p>
</dd>

<dd id="wx81">
<p id="wx82">= 160 + 1</p>
</dd>

<dd id="wx83">
<p id="wx84">= 161</p>
</dd>
</dl>

<pre id="wx85">
  1111 1111                        255 
− 0101 1111                      −  95   
===========                      =====
  1010 0000  (complemento a uno)   160
+         1                      +   1
===========                      =====
  1010 0001  (complemento a due)   161
</pre>

<p id="wx86"><br id="wx87"/>
</p>

<a id="Voci_correlate" name="Voci_correlate"/>
</wx:section><wx:section level="2" title="Voci correlate" id="wxsec7"><h2 id="wx88">Voci correlate</h2>

<ul id="wx89">
<li id="wx90"><a href="/wit/Grandezza_e_segno" class="new" title="Grandezza e segno" wx:linktype="unknown" wx:pagename="Grandezza_e_segno" id="wx91">Grandezza e segno</a></li>

<li id="wx92"><a href="/wit/Complemento_a_uno" title="Complemento a uno" wx:linktype="known" wx:pagename="Complemento_a_uno" wx:page_id="688127" id="wx93">Complemento a uno</a></li>

<li id="wx94"><a href="/wit/Eccesso_N" class="new" title="Eccesso N" wx:linktype="unknown" wx:pagename="Eccesso_N" id="wx95">Eccesso N</a></li>
</ul>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wit/index.php?title=Speciale:Categories&amp;article=Complemento_a_due" title="Speciale:Categories" wx:linktype="known" wx:pagename="Speciale:Categories" id="wx96">Categoria</a>: <span dir="ltr" id="wx97"><a href="/wit/Categoria:Standard_informatici" title="Categoria:Standard informatici" wx:linktype="known" wx:pagename="Categoria:Standard_informatici" wx:page_id="674581" id="wx98">Standard informatici</a></span></div>
<div id="wx_languagelinks">
Altre lingue: <a href="http://ar.wikipedia.org/wiki/%D8%A7%D9%84%D9%85%D8%AA%D9%85%D9%85_%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A" class="external" wx:linktype="interwiki" wx:pagename="ar:المتمم_الثنائي" id="wx99">العربية</a> | <a href="http://ca.wikipedia.org/wiki/Complement_a_dos" class="external" wx:linktype="interwiki" wx:pagename="ca:Complement_a_dos" id="wx100">Català</a> | <a href="http://cs.wikipedia.org/wiki/Dvojkov%C3%BD_dopln%C4%9Bk" class="external" wx:linktype="interwiki" wx:pagename="cs:Dvojkový_doplněk" id="wx101">Česky</a> | <a href="http://de.wikipedia.org/wiki/Zweierkomplement" class="external" wx:linktype="interwiki" wx:pagename="de:Zweierkomplement" id="wx102">Deutsch</a> | <a href="http://en.wikipedia.org/wiki/Two%27s_complement" class="external" wx:linktype="interwiki" wx:pagename="en:Two's_complement" id="wx103">English</a> | <a href="http://es.wikipedia.org/wiki/Complemento_a_dos" class="external" wx:linktype="interwiki" wx:pagename="es:Complemento_a_dos" id="wx104">Español</a> | <a href="http://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux" class="external" wx:linktype="interwiki" wx:pagename="fr:Complément_à_deux" id="wx105">Français</a> | <a href="http://he.wikipedia.org/wiki/%D7%9E%D7%A9%D7%9C%D7%99%D7%9D_%D7%9C-2" class="external" wx:linktype="interwiki" wx:pagename="he:משלים_ל-2" id="wx106">עברית</a> | <a href="http://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0" class="external" wx:linktype="interwiki" wx:pagename="ja:2の補数" id="wx107">日本語</a> | <a href="http://nl.wikipedia.org/wiki/Two%27s_complement" class="external" wx:linktype="interwiki" wx:pagename="nl:Two's_complement" id="wx108">Nederlands</a> | <a href="http://pl.wikipedia.org/wiki/Kod_uzupe%C5%82nie%C5%84_do_dw%C3%B3ch" class="external" wx:linktype="interwiki" wx:pagename="pl:Kod_uzupełnień_do_dwóch" id="wx109">Polski</a> | <a href="http://pt.wikipedia.org/wiki/Complemento_para_dois" class="external" wx:linktype="interwiki" wx:pagename="pt:Complemento_para_dois" id="wx110">Português</a> | <a href="http://ro.wikipedia.org/wiki/Complement_fa%C5%A3%C4%83_de_doi" class="external" wx:linktype="interwiki" wx:pagename="ro:Complement_faţă_de_doi" id="wx111">Română</a> | <a href="http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_%28%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0%29" class="external" wx:linktype="interwiki" wx:pagename="ru:Дополнительный_код_(представление_числа)" id="wx112">Русский</a> | <a href="http://sv.wikipedia.org/wiki/Tv%C3%A5komplementsform" class="external" wx:linktype="interwiki" wx:pagename="sv:Tvåkomplementsform" id="wx113">Svenska</a> | <a href="http://tr.wikipedia.org/wiki/%C4%B0kiye_t%C3%BCmleyen" class="external" wx:linktype="interwiki" wx:pagename="tr:İkiye_tümleyen" id="wx114">Türkçe</a> | <a href="http://vi.wikipedia.org/wiki/B%C3%B9_2" class="external" wx:linktype="interwiki" wx:pagename="vi:Bù_2" id="wx115">Tiếng Việt</a> | <a href="http://zh.wikipedia.org/wiki/%E4%BA%8C%E8%A3%9C%E6%95%B8" class="external" wx:linktype="interwiki" wx:pagename="zh:二補數" id="wx116">中文</a></div>
</body>
</html>
