Come vengono memorizzati i valori con segno negativo?


13

Stavo guardando questo video sui valori massimo e minimo di numeri interi con segno.

Prendi un esempio di un valore con segno positivo - 0000 0001 Il primo bit indica che il numero è positivo e gli ultimi 7 bit sono il numero stesso. Quindi è facilmente interpretabile come +1.

Ora prendiamo un esempio di un valore con segno negativo - 1000 0000 che risulta essere -8. Ok, il computer può capire che è un valore negativo a causa del primo bit, ma come diavolo capisce che 000 0000 significa -8?

In generale, come vengono memorizzati / interpretati in un computer i valori con segno negativo?


nl.wikipedia.org/wiki/Two%27s_complement è il modo in cui i numeri binari sono memorizzati nei computer.
Pieter B,

@PieterB Forse il tuo computer. E molte altre persone. Per buoni motivi! Ma non implicare che sia l'unico modo.
underscore_d

In qualsiasi modo ti piaccia. Mi vengono in mente almeno 256! modi di memorizzare i numeri binari (8 bit) sui computer. Tuttavia, la maggior parte di questi sono incredibilmente sciocchi.
Caleth,

C non specifica, è in gran parte il modo in cui il produttore del chip decide di rappresentare i dati. C viene compilato in base al codice macchina e si cura di non ridefinire il modo in cui il chip memorizza i numeri. Le stesse regole si applicano ai numeri in virgola mobile. Spetta al produttore del chip definire come sono memorizzati. La maggior parte dei produttori di chip usa il complemento di 2, ma sono sicuro che ci sono eccezioni.
Berin Loritsch,

Risposte:


29

Lo standard C non impone alcun modo particolare di rappresentare numeri con segno negativo.

Nella maggior parte delle implementazioni che è probabile che si verifichino, gli interi con segno negativo vengono archiviati nel cosiddetto complemento a due . L'altro modo principale di memorizzare numeri con segno negativo è chiamato complemento .

Il complemento a due di un numero N-bit xè definito come 2^N - x. Ad esempio, il complemento a due di 8 bit 1è 2^8 - 1o 1111 1111. Il complemento a due di 8 bit 8è 2^8 - 8, che in binario è 1111 1000. Questo può anche essere calcolato lanciando i bit di xe aggiungendone uno. Per esempio:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

Il complemento di uno di un numero N-bit x è definito come x con tutti i suoi bit capovolti, in pratica.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

Il complemento a due ha diversi vantaggi rispetto al proprio complemento. Ad esempio, non ha il concetto di "zero negativo", che per buona ragione è fonte di confusione per molte persone. Addizione, moltiplicazione e sottrazione funzionano allo stesso modo con numeri interi con segno implementati con due integrati come pure con numeri interi senza segno.


19

Esistono tre metodi ben noti per rappresentare valori negativi in ​​binario:

  1. Magnitudine firmata . Questo è il più facile da capire, perché funziona allo stesso modo a cui siamo abituati quando abbiamo a che fare con valori decimali negativi: la prima posizione (bit) rappresenta il segno (0 per positivo, 1 per negativo) e gli altri bit rappresentano il numero . Sebbene sia facile da capire per noi, è difficile lavorare con i computer, specialmente quando si esegue l'aritmetica con numeri negativi.
    In magnitudine con segno a 8 bit, il valore 8 è rappresentato come 0 0001000 e -8 come 1 0001000.

  2. Il complemento . In questa rappresentazione, i numeri negativi vengono creati dal corrispondente numero positivo capovolgendo tutti i bit e non solo il bit del segno. Ciò semplifica il lavoro con numeri negativi per un computer, ma ha la complicazione che ci sono due rappresentazioni distinte per +0 e -0. Il lancio di tutti i bit rende questo più difficile da capire per gli umani.
    Nel complemento a 8 bit, il valore 8 è rappresentato come 00001000 e -8 come 11110111.

  3. Complemento a due . Questa è la rappresentazione più comune usata al giorno d'oggi per numeri interi negativi perché è la più semplice con cui lavorare per i computer, ma è anche la più difficile da capire per gli umani. Quando si confrontano i modelli di bit utilizzati per valori negativi tra il proprio complemento e il complemento a due, si può osservare che lo stesso modello di bit nel complemento a due codifica per il successivo numero inferiore. Ad esempio 11111111 sta per -0 nel complemento a uno e per -1 nel complemento a due, e allo stesso modo per 10000000 (-127 contro -128).
    Nel complemento a 8 bit due, il valore 8 è rappresentato come 00001000 e -8 come 11111000.


8
La magnitudine firmata ha anche due zero.
Jörg W Mittag,

+1 per menzionare segno / grandezza. non comune e scomodo (per CPU se non umani!), ma vale la pena saperlo.
underscore_d

Quasi tutti lavoriamo con magnitudine firmata, specialmente con numeri FP.
Paulo 1205,

2

Gli interi con segno vengono archiviati utilizzando http://en.wikipedia.org/wiki/Two%27s%20complement

Quindi ottieni:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

Fondamentalmente è molto facile contare, contate fino alla metà del massimo dell'intero con segno. Fai un +1, rendilo negativo e inizia il conto alla rovescia.

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.