Come vengono memorizzati i valori firmati negativi? [duplicare]

7

Stavo guardando questo video sui valori massimi e minimi degli interi con segno.

Fai 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 prendi un esempio di 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, in che modo i valori firmati negativi sono memorizzati / interpretati in un computer?

    
posta discussedtree 14.05.2014 - 11:28
fonte

3 risposte

21

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

Nella maggior parte delle implementazioni che potresti incontrare, gli interi con segno negativo sono memorizzati in quello che è chiamato complemento a due . L'altro modo principale di memorizzare i numeri con segno negativo è chiamato one's complement .

Il complemento a due di un numero N di% x è definito come 2^N - x . Ad esempio, il complemento a due di 8-bit 1 è 2^8 - 1 o 1111 1111 . Il complemento a due di 8-bit 8 è 2^8 - 8 , che in binario è 1111 1000 . Questo può anche essere calcolato capovolgendo i bit di x e aggiungendone uno. Ad 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 a un numero di 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 una buona ragione confonde molte persone. Addizione, moltiplicazione e sottrazione funzionano allo stesso modo con interi con segno implementati con due completati come fanno anche con interi senza segno.

    
risposta data 14.05.2014 - 11:44
fonte
12

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 di quando si ha 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 eseguono operazioni aritmetiche con numeri negativi.
    In magnitudine firmata 8 bit, il valore 8 è rappresentato come 0 0001000 e -8 come 1 0001000.

  2. Il proprio complemento . In questa rappresentazione, i numeri negativi vengono creati dal numero positivo corrispondente capovolgendo tutti i bit e non solo il bit del segno. Questo rende più facile lavorare con numeri negativi per un computer, ma ha la complicazione che ci sono due rappresentazioni distinte per +0 e -0. Il capovolgimento 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 gli interi negativi perché è la più facile da usare per i computer, ma è anche la più difficile da capire per gli umani. Quando si confrontano i pattern di bit usati per i valori negativi tra il complemento a uno e il complemento a due, si può osservare che lo stesso schema 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 vs -128).
    Nel complemento a 8 bit a due, il valore 8 è rappresentato come 00001000 e -8 come 11111000.

risposta data 14.05.2014 - 12:07
fonte
2

Gli interi con segno sono memorizzati usando link

Quindi ottieni:

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

Fondamentalmente è un conteggio molto semplice, si conta fino alla metà del massimo del numero intero con segno. Fai +1, rendilo negativo e inizia il conto alla rovescia.

    
risposta data 14.05.2014 - 11:41
fonte

Leggi altre domande sui tag