Perché preferire il complemento a due rispetto a segno e grandezza per i numeri firmati?


201

Sono solo curioso di sapere se c'è un motivo per cui per rappresentare -1 in binario, si usa il complemento a due: capovolgere i bit e aggiungere 1?

-1 è rappresentato da 11111111 (complemento a due) piuttosto che (per me più intuitivo) 10000001 che è binario 1 con il primo bit come flag negativo.

Disclaimer: non mi affido all'aritmetica binaria per il mio lavoro!


6
FWIW, il tuo metodo "intuitivo" di utilizzo di un bit di segno viene utilizzato in modo occasionale - ad esempio, la maggior parte dei computer utilizza un bit di segno quando si rappresentano numeri in virgola mobile.
Adisak,

2
@Adisak Si chiama grandezza firmata
Cole Johnson

2
Ho sempre associato la rappresentazione di segno e grandezza con numeri interi poiché i numeri in virgola mobile contengono tre componenti: un segno, un esponente e una mantissa (spesso con un "1" implicito). Ma suppongo che sia abbastanza facile trattare l'esponente e la mantissa come magnitudo fintanto che ci si rende conto che non sono strettamente lineari.
Adisak,

Ecco un articolo che discute come i numeri in virgola mobile sono memorizzati in binario, per coloro che sono curiosi delle osservazioni di @ Adisak.
PIL2,

Ho appena visto un bel video che spiega questo youtube.com/watch?v=dHB7jFjESLY
allenlinli

Risposte:


333

È fatto in modo che l'addizione non debba avere una logica speciale per gestire i numeri negativi. Dai un'occhiata all'articolo su Wikipedia .

Supponi di avere due numeri, 2 e -1. Nel tuo modo "intuitivo" di rappresentare i numeri, sarebbero 0010e 1001, rispettivamente (sto aderendo a 4 bit per dimensione). Nel modo del complemento a due , sono 0010e1111 . Ora, diciamo che voglio aggiungerli.

L'aggiunta del complemento a due è molto semplice. Aggiungete i numeri normalmente e ogni bit di trasporto alla fine viene scartato. Quindi vengono aggiunti come segue:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 è 1, che è il risultato atteso di "2 + (- 1)".

Ma nel tuo metodo "intuitivo", l'aggiunta è più complicata:

  0010
+ 1001
= 1011

Qual è -3, giusto? L'aggiunta semplice non funziona in questo caso. È necessario notare che uno dei numeri è negativo e, in tal caso, utilizzare un algoritmo diverso.

Per questo metodo di memorizzazione "intuitivo", la sottrazione è un'operazione diversa dall'aggiunta, che richiede ulteriori controlli sui numeri prima che possano essere aggiunti. Poiché si desidera che le operazioni di base (addizione, sottrazione, ecc.) Siano il più veloci possibile, è necessario memorizzare i numeri in un modo che consenta di utilizzare gli algoritmi più semplici possibili.

Inoltre, nel metodo di archiviazione "intuitivo", ci sono due zero:

0000  "zero"
1000  "negative zero"

Che sono intuitivamente lo stesso numero ma hanno due valori diversi se memorizzati. Ogni applicazione dovrà adottare ulteriori misure per assicurarsi che anche i valori diversi da zero non siano zero negativo.

C'è un altro vantaggio con la memorizzazione di ints in questo modo, ed è allora che è necessario estendere la larghezza del registro in cui è archiviato il valore. Con il complemento a due, la memorizzazione di un numero a 4 bit in un registro a 8 bit è una questione di ripetere il suo bit più significativo:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

È solo una questione di guardare il segno della parola più piccola e di ripeterlo fino a quando non riempie la larghezza della parola più grande.

Con il tuo metodo dovrai cancellare il bit esistente, che è un'operazione aggiuntiva oltre al riempimento:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

È comunque necessario impostare quei 4 bit extra in entrambi i casi, ma nel caso "intuitivo" è necessario cancellare anche il 5 ° bit. È un piccolo passo in più in una delle operazioni più fondamentali e comuni presenti in ogni applicazione.


13
Sono d'accordo. Il complemento di 2 funziona. Ma come ci siamo arrivati ​​in primo luogo? Se supponiamo di dover arrivare a questa notazione, quale sarebbe il processo di pensiero. Penso che arrivare al complemento di 2 debba essere più che solo fortuna, no?
Lazer,

1
Inoltre, perché non esiste una controparte del complemento 2 per i galleggianti?
Lazer,

6
@Lazer controlla questo articolo per conoscere how we arrived at 2s compliment the first place. cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Ankit

1
Per quanto ne so Java, Java ha firmato solo tipi interi, quindi lo tratta sempre nell'interpretazione del complemento a due. In altre lingue, come viene trattato il valore dipende da come lo tratta il codice. Non c'è niente da dirti che un blocco di memoria è un numero intero con o senza segno o un doppio o una stringa o qualcos'altro. I dati non elaborati sono di qualsiasi tipo si scelga di interpretarli.
Welbog,

3
@Suraj, suggerisco di guardare l'articolo di Wikipedia sul complemento a due per la risposta completa: en.wikipedia.org/wiki/Two%27s_complement . La risposta breve è il MSB 1indica -8, e le rimanenti tre 1s indicano 4, 2e 1, rispettivamente, così -8+4+2+1 = -1.
Welbog,

18

Wikipedia dice tutto:

Il sistema a due complementi ha il vantaggio di non richiedere che i circuiti di addizione e sottrazione esaminino i segni degli operandi per determinare se aggiungere o sottrarre. Questa proprietà rende il sistema più semplice da implementare e in grado di gestire facilmente aritmetica di precisione più elevata. Inoltre, zero ha una sola rappresentazione, ovviando alle sottigliezze associate allo zero negativo, che esiste nei sistemi a complemento a uno.

In altre parole, aggiungere è lo stesso, sia che il numero sia negativo.


Signore, se scrivo char a = 12; e unsigned char b = 12, il bit patter sottostante è lo stesso, cosa succede davvero?
Suraj Jain,

Nulla cambia quando scrive o legge. Applicabile solo in caso di aggiunta o sottrazione.
Talespin_Kit,

12

Anche se questa domanda è vecchia, lasciami inserire i miei 2 centesimi.

Prima di spiegare questo, torniamo alle basi. 2 'complemento è il complemento di 1 + 1. Ora qual è il complemento di 1 e qual è il suo significato in aggiunta.

La somma di qualsiasi numero di n-bit e il relativo complemento a 1 fornisce il numero più alto possibile che può essere rappresentato da quei n-bit. Esempio:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Ora cosa succederà se proviamo ad aggiungere 1 in più al risultato. Si tradurrà in un overflow.

Il risultato sarà 1 00000 (dato che stiamo lavorando con numeri a 4 bit, (1 a sinistra è un overflow)

Così ,

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Qualcuno ha quindi deciso di chiamare il complemento 1 + 1 come complemento 2 '. Quindi l'istruzione precedente diventa: Qualsiasi numero n'bit + il suo complemento a 2 = 0 che significa il complemento a 2 di un numero = - (di quel numero)

Tutto ciò porta ad un'altra domanda, perché possiamo usare solo il (n-1) degli n bit per rappresentare un numero positivo e perché l'ennesimo bit più a sinistra rappresenta il segno (0 sul bit più a sinistra significa + ve numero, e 1 significa -ve numero). ad es. perché utilizziamo solo i primi 31 bit di un int in Java per rappresentare un numero positivo se il 32 ° bit è 1, il suo numero a -ve.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (il risultato è zero, con il carry 1 traboccante)

Quindi il sistema di (n + 2'complement di n) = 0, funziona ancora. L'unica ambiguità qui è il complemento di 2 di 12 è 0100 che rappresenta ambiguamente anche +8, oltre a rappresentare -12 nel sistema di complementi di 2s.

Questo problema verrà risolto se i numeri positivi hanno sempre uno 0 nel bit più a sinistra. In tal caso, il complemento di 2 avrà sempre un 1 nella parte più a sinistra, e non avremo l'ambiguità dello stesso insieme di bit che rappresenta un numero di complemento di 2 e un numero + ve.


1
Fatto +1. Era un'informazione, tuttavia alla fine non sono sicuro del motivo per cui si desidera che l'approccio del bit più significativo rappresenti se si tratta di un numero positivo o negativo. Ha molti problemi come 0 avrà 2 rappresentazioni - 0000 (+) e 1000 (-) .. Inoltre, l'addizione e la sottrazione non possono essere eseguite usando lo stesso algoritmo. Quando dici un 0100 normale, allora è +8 e quando dici un complemento a due 0100, allora è -12 ..
hagrawal

8

Il complemento a due consente di aggiungere e sottrarre in modo normale (come se avessi ferito per numeri non firmati). Inoltre impedisce -0 (un modo separato per rappresentare 0 che non sarebbe uguale a 0 con il normale metodo bit per bit di confronto dei numeri).


6

questo per semplificare somme e differenze di numeri. una somma di un numero negativo e uno positivo codificato nei complementi di 2 è lo stesso che sommarli in modo normale.


5

La consueta implementazione dell'operazione è "capovolgi i bit e aggiungi 1", ma c'è un altro modo di definirlo che probabilmente rende più chiara la logica. Il complemento di 2 è la forma che ottieni se prendi la solita rappresentazione senza segno in cui ogni bit controlla la potenza successiva di 2 e rendi il termine più significativo negativo.

Prendendo un valore di 8 bit a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

La solita interpretazione binaria senza segno è:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

L'interpretazione del complemento a due è:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

Nessuno degli altri bit cambia significato, e portare in un 7 è "overflow" e non dovrebbe funzionare, quindi praticamente tutte le operazioni aritmetiche funzionano senza modifiche (come altri hanno notato). La grandezza del segno generalmente controlla il bit del segno e usa una logica diversa.


4

Il complemento a due consente di sommare numeri negativi e positivi senza alcuna logica speciale.

Se hai provato ad aggiungere 1 e -1 usando il tuo metodo
10000001 (-1)
+00000001 (1)
otterrai
10000010 (-2)

Invece, usando il complemento a due, possiamo aggiungere

11111111 (-1)
+00000001 (1) ottieni
00000000 (0)

Lo stesso vale per la sottrazione.

Inoltre, se provi a sottrarre 4 da 6 (due numeri positivi) puoi complemento 2 di 2 e sommare i due 6 + (-4) = 6 - 4 = 2

Ciò significa che la sottrazione e l'aggiunta di numeri sia positivi che negativi possono essere eseguite dallo stesso circuito nella CPU.


4

Per espandere le risposte degli altri:

Nel complemento a due

  • L'aggiunta è lo stesso meccanismo dell'aggiunta di interi positivi semplici.
  • Anche la sottrazione non cambia
  • Anche la moltiplicazione!

La divisione richiede un meccanismo diverso.

Tutto ciò è vero perché il complemento a due è una normale aritmetica modulare, in cui scegliamo di considerare alcuni numeri come negativi sottraendo il modulo.


Non solo la moltiplicazione non allargata è la stessa . Ma poiché la maggior parte delle lingue di alto livello non supporta l'ampliamento della moltiplicazione senza cast esplicito, il risultato sarà lo stesso in quelle lingue.
phuclv,

@ LưuVĩnhPhúc: la moltiplicazione allargata sarà generalmente la stessa, ma i risultati per la moltiplicazione firmata e non firmata sono garantiti solo se il risultato si adatterà nell'intervallo di un int firmato. Alcuni compilatori come gcc, dato qualcosa come unsigned mul(unsigned short x, unsigned short y) { return x*y; }[16-bit short; 32-bit int] genererà occasionalmente codice che non funzionerà correttamente se il prodotto è più grande di 2147483647.
supercat

2

Leggendo le risposte a questa domanda, mi sono imbattuto in questo commento [modificato].

Il complemento di 2 di 0100 (4) sarà 1100. Ora 1100 è 12 se dico normalmente. Quindi, quando dico 1100 normale, allora è 12, ma quando dico il complemento di 2 1100, allora è -4? Inoltre, in Java quando 1100 (supponiamo per ora 4 bit) è memorizzato, allora come viene determinato se è +12 o -4 ?? - hagrawal, 2 luglio alle 16:53

A mio avviso, la domanda posta in questo commento è piuttosto interessante e quindi prima di tutto vorrei riformularla e quindi fornire una risposta e un esempio.

DOMANDA - Come può il sistema stabilire come interpretare uno o più byte adiacenti? In particolare, come può il sistema stabilire se una determinata sequenza di byte è un numero binario normale o un numero di complemento di 2?

RISPOSTA - Il sistema stabilisce come interpretare una sequenza di byte attraverso i tipi. Tipi definiti

  • quanti byte devono essere considerati
  • come devono essere interpretati quei byte

ESEMPIO - Di seguito assumiamo che

  • charsono lunghi 1 byte
  • shortsono lunghi 2 byte
  • int'e float' sono lunghi 4 byte

Si prega di notare che queste dimensioni sono specifiche per il mio sistema. Sebbene abbastanza comuni, possono essere diversi da sistema a sistema. Se sei curioso di sapere cosa sono sul tuo sistema, usa l' operatore sizeof .

Innanzitutto definiamo un array contenente 4 byte e inizializziamo tutti sul numero binario 10111101, corrispondente al numero esadecimale BD.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Quindi leggiamo il contenuto dell'array usando tipi diversi.

unsigned char e signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short e short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, intefloat

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

I 4 byte nella RAM ( l_Just4Bytes[ 0..3 ]) rimangono sempre esattamente gli stessi. L'unica cosa che cambia è il modo in cui li interpretiamo.

Anche in questo caso, noi diciamo il sistema come interpretarli attraverso i tipi .

Ad esempio, sopra abbiamo usato i seguenti tipi per interpretare il contenuto l_Just4Bytesdell'array

  • unsigned char: 1 byte in binario semplice
  • signed char: 1 byte nel complemento di 2
  • unsigned short: 2 byte in notazione binaria semplice
  • short: 2 byte nel complemento a 2
  • unsigned int: 4 byte in notazione binaria semplice
  • int: 4 byte nel complemento a 2
  • float: 4 byte nella notazione a precisione singola IEEE 754

[EDIT] Questo post è stato modificato dopo il commento dell'utente4581301. Grazie per aver dedicato del tempo a eliminare quelle poche righe utili!


Quel BLOB di codice ha bisogno di una modifica, quindi i lettori non devono continuare a scorrere avanti e indietro. Meglio, quell'enorme commento in alto dovrebbe diventare un semplice vecchio testo e lasciare che il renderer si occupi della formattazione. Dovresti anche aggiungere un avvertimento alla punta vicino alla fine in cui si discutono le dimensioni e la formattazione perché le dimensioni non sono fisse.
user4581301

+1. Una cosa che potresti considerare di fare, @ mw215, è rendere questa domanda / risposta una voce Wiki della comunità autonoma, perché è utile per le persone che potrebbero essere interessate all'interpretazione dei byte grezzi al di fuori del contesto della matematica del complemento a due.
Welbog,

Voglio solo sapere che il complemento di 2 è sempre seguito, intendo se l'ho fatto int x = -4, e poi faccio printf("%d" , x)come viene interpretato? Anche qual è la differenza tra unsigned inte signed inte %de %u... questo mi ha infastidito da molto tempo ormai. Grazie.
Suraj Jain,

@Suraj Jain Quando si utilizzano i inttipi, il signedmodificatore è predefinito. Ciò significa che inte signed intsono esattamente dello stesso tipo. Quindi le due definizioni int i = -4;e signed int i = -4;hanno lo stesso significato.
mw215

@Suraj Jain Il sistema stabilisce come interpretare una sequenza di byte attraverso i tipi. I tipi definiscono: quanti byte devono essere considerati e come questi byte devono essere interpretati. An intè 4 byte nel complemento di 2 e unsigned int4 è in notazione binaria semplice (controlla l'effettiva dimensione del tipo sul tuo sistema usando l' sizeofoperatore).
mw215,

1

Puoi guardare il professor Jerry Cain di Stanford che spiega il complemento a due, nella seconda lezione (la spiegazione relativa al complemento a 2 inizia intorno alle 13:00) nella serie di lezioni chiamate Paradigmi di programmazione disponibili per la visione dal canale YouTube di Standford. Ecco il link alla serie di lezioni: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .


0

Il complemento a due viene utilizzato perché è più semplice da implementare nei circuiti e inoltre non consente uno zero negativo.

Se ci sono x bit, il complemento a due varierà da + (2 ^ x / 2 + 1) a - (2 ^ x / 2). Il complemento di uno verrà eseguito da + (2 ^ x / 2) a - (2 ^ x / 2), ma consentirà uno zero negativo (0000 è uguale a 1000 nel sistema di complemento a 4 bit 1).


0

Bene, il tuo intento non è davvero quello di invertire tutti i bit del tuo numero binario. In realtà è sottrarre ciascuna cifra da 1. È solo una coincidenza fortunata che la sottrazione di 1 da 1 si traduca in 0 e la sottrazione di 0 da 1 si traduca in 1. Quindi lanciare i bit sta effettivamente effettuando questa sottrazione.

Ma perché trovi la differenza di ogni cifra da 1? Bene, non lo sei. Il tuo intento reale è calcolare la differenza del numero binario dato da un altro numero binario che ha lo stesso numero di cifre ma contiene solo 1. Ad esempio, se il tuo numero è 10110001, quando capovolgi tutti quei bit, stai effettivamente calcolando (11111111 - 10110001).

Questo spiega il primo passo nel calcolo del complemento a due. Ora includiamo il secondo passaggio - aggiungendo 1 - anche nell'immagine.

Aggiungi 1 all'equazione binaria sopra:

11111111-10110001 + 1

Che cosa ottieni? Questo:

100000000 - 10110001

Questa è l'equazione finale. E eseguendo questi due passaggi stai cercando di trovare questa, ultima differenza: il numero binario sottratto da un altro numero binario con una cifra in più e contenente zeri tranne nella posizione del bit più significativo.

Ma perché desideriamo ardentemente questa differenza? Bene, da qui in poi, suppongo che sarebbe meglio se leggessi l' articolo di Wikipedia .


0

Eseguiamo solo operazioni di addizione sia per addizione che per sottrazione. Aggiungiamo il secondo operando al primo operando per aggiunta. Per sottrazione aggiungiamo il complemento 2 del secondo operando al primo operando.

Con una rappresentazione del complemento a 2 non abbiamo bisogno di componenti digitali separati per la sottrazione: vengono utilizzati solo additivi e complementi.


0

Vale la pena notare che su alcune macchine che aggiungono in anticipo, prima dei giorni dei computer digitali, la sottrazione verrebbe eseguita facendo in modo che l'operatore inserisse i valori usando un diverso set di legende su ogni tasto (quindi ogni tasto inseriva nove meno il numero da sottratto), e premere un pulsante speciale avrebbe assunto un riporto in un calcolo. Pertanto, su una macchina a sei cifre, per sottrarre 1234 da un valore, l'operatore preme i tasti che normalmente indicano "998.765" e preme un pulsante per aggiungere quel valore più uno al calcolo in corso. L'aritmetica del complemento di Two è semplicemente l'equivalente binario di quella precedente dell'aritmetica del "complemento di dieci".


0

Il vantaggio di eseguire la sottrazione con il metodo del complemento è la riduzione della
complessità dell'hardware. Non sono necessari i diversi circuiti digitali per l'aggiunta e la sottrazione. Sia l'aggiunta che la sottrazione vengono eseguite solo dal sommatore.


0

Un grande vantaggio della rappresentazione del complemento a due che non è stato ancora menzionato qui è che i bit inferiori di una somma, una differenza o un prodotto del complemento a due dipendono solo dai bit corrispondenti degli operandi. Il motivo per cui il valore con segno a 8 bit per -1 è11111111 che sottraendo qualsiasi numero intero i cui 8 bit più bassi provengono 00000001da qualsiasi altro numero intero i cui 8 bit più bassi sono 0000000genererà un numero intero i cui 8 bit più bassi sono11111111. Matematicamente, il valore -1 sarebbe una stringa infinita di 1, ma tutti i valori all'interno dell'intervallo di un particolare tipo intero saranno tutti gli 1 o tutti gli 0 oltre un certo punto, quindi è conveniente per i computer "firmare-estendere" il bit più significativo di un numero come se rappresentasse un numero infinito di 1 o 0.

Il complemento a due è quasi l'unica rappresentazione del numero con segno che funziona bene quando si tratta di tipi più grandi della dimensione della parola naturale di una macchina binaria, poiché quando si esegue l'addizione o la sottrazione, il codice può recuperare il blocco più basso di ciascun operando, calcolare il blocco più basso di il risultato e memorizzarlo, quindi caricare il blocco successivo di ciascun operando, calcolare il blocco successivo del risultato e memorizzarlo, ecc. Pertanto, anche un processore che richiede tutte le aggiunte e sottrazioni passa attraverso un singolo registro a 8 bit può gestire i numeri con segno a 32 bit in modo ragionevolmente efficiente (più lento rispetto a un registro a 32 bit, ovviamente, ma comunque praticabile).

Quando si utilizza qualsiasi altra rappresentazione firmata consentita dallo standard C, ogni bit del risultato potrebbe essere potenzialmente influenzato da qualsiasi bit degli operandi, rendendo necessario tenere un intero valore nei registri contemporaneamente oppure seguire i calcoli con un extra passaggio che, almeno in alcuni casi, richiederebbe la lettura, la modifica e la riscrittura di ogni blocco del risultato.


Si prega di formattare la risposta nel paragrafo e contrassegnare il codice come codice, sarebbe più leggibile e si otterrà il voto.
Suraj Jain,

@SurajJain: è meglio?
supercat,

Sì, meglio di quanto non fosse prima, voglio chiederti una cosa qual è la differenza tra il carattere con segno a = 1 e il segno senza segno a = 1, come sono rappresentati in memoria.
Suraj Jain,

@SurajJain: Sui sistemi a complemento a due in cui "char" è più piccolo di "int" [cioè la stragrande maggioranza dei sistemi], i tipi di caratteri con segno e senza segno si comporteranno in modo identico tranne che i tipi con segno saranno estesi con segno quando tipi letti e non firmati non lo faranno. Su un tale sistema, la memorizzazione del valore 194 o -62 in un carattere con segno scriverà lo stesso modello di bit della memorizzazione di 194 o -62 in un carattere senza segno (cioè 11000010). La lettura di quel modello di bit da un carattere con segno produrrà -62 e la lettura da un carattere senza segno produrrà 194.
supercat

significa esteso?
Suraj Jain,

0

Esistono diversi tipi di rappresentazioni:

  1. rappresentazione del numero senza segno
  2. rappresentazione numerica firmata
  3. rappresentazione del proprio complemento
  4. Rappresentazione del complemento a due

-Rappresentazione numerica non firmata utilizzata per rappresentare solo numeri positivi

- Rappresentazione numerica firmata utilizzata per rappresentare un numero positivo e negativo. In Rappresentazione numerica firmata, il bit MSB rappresenta il bit di segno e i bit di riposo rappresentano il numero. Quando MSB è 0 significa che il numero è positivo e Quando MSB è 1 significa che il numero è negativo.

Il problema con la rappresentazione dei numeri firmati è che ci sono due valori per 0.

Il problema con la rappresentazione del proprio complemento è che ci sono due valori per 0.

Ma se usiamo la rappresentazione del complemento di Due allora ci sarà un solo valore per 0, ecco perché rappresentiamo i numeri negativi nella forma del complemento di due.

Fonte: perché i numeri negativi vengono archiviati nel complemento a due byte bytesggigabytes


-1

Una risposta soddisfacente del perché il complemento di Two2 è usato per rappresentare numeri negativi piuttosto che il sistema del complemento di One è che il sistema del complemento di Two risolve il problema delle rappresentazioni multiple di 0 e la necessità di portare a termine che esiste nel sistema del complemento di One di rappresentare il negativo numeri.

Per maggiori informazioni visita https://en.wikipedia.org/wiki/Signed_number_representations

Per End-around-carry Visita https://en.wikipedia.org/wiki/End-around_carry


in realtà, se hai un punto decimale e sei esplicito su cosa siano tutti i bit: "0..0000.1111..1" significa che tutti i bit non dichiarati più a sinistra sono 0 e tutti i bit non dichiarati più a destra sono 1, e quindi il "..1" significa che viene attivato un carry. Pertanto è (meccanicamente) "0.0001.0000..0". Significa che "1..1111.1111..1" è uguale a zero! Questo significa anche che per negare un numero intero, devi semplicemente capovolgerne i bit. Ma ora si applica alle frazioni rappresentabili.
Rob,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.