Perché il valore minimo di ints, doppi, ecc. 1 più lontano da zero rispetto al valore positivo?


10

So che ha qualcosa a che fare con il complemento di 2 e l'aggiunta di 1, ma non capisco come si possa codificare un altro numero con la stessa quantità di bit quando si tratta di numeri negativi.


3
La parte davvero cattiva di questo è che Abs (MinValue) è negativo.
OldFart

1
in java Double.MIN_VALUE è il valore positivo più piccolo e i numeri (reali) più lontani da zero hanno uguale grandezza (in quanto ha un bit di segno appropriato)
maniaco del cricchetto

Risposte:


16

Pensaci in questi termini. Prendi un numero a 2 bit con un segno precedente:

000 = 0
001 = 1
010 = 2
011 = 3

Ora diamo alcuni aspetti negativi:

111 = -1
110 = -2
101 = -3

Aspetta, abbiamo anche

100 ... 

Deve essere negativo, poiché il bit di segno è 1. Quindi, logicamente, deve essere -4.

(Modifica: come giustamente sottolinea WorldEngineer , non tutti i sistemi di numerazione funzionano in questo modo, ma quelli su cui ti stai chiedendo lo fanno.)


11

Perché non ci sono due classi di numeri nell'intervallo intero, ma tre: numeri negativi, zero e numeri positivi. Lo zero deve occupare uno slot (sarebbe piuttosto impraticabile non essere in grado di rappresentare lo zero ...), quindi la classe positiva o negativa deve rinunciare a uno slot. Il fatto che di solito è l'intervallo positivo che deve rendere quel sacrificio è in una certa misura arbitrario, ma a livello di manipolazioni dei bit ci sono alcune cose che questa decisione rende più conveniente.


Non sono solo piccole manipolazioni. L'insieme di numeri con segno a 32 bit è l'insieme di numeri la cui rappresentazione binaria ha lo stesso valore in tutti i bit dopo il 31, e uno di questi numeri ha un insieme infinito di quelli seguiti da 31 zero. L'inverso additivo di quel numero, una stringa infinita di zero seguita da un singolo 1 e 31 zero, non si adatta al modello richiesto per i valori con segno.
supercat,

4

Esistono fondamentalmente tre modi per rappresentare numeri interi con segno in binario: complemento di 2, complemento di 1 e magnitudine del segno. (Il Biquinary ha seguito la strada dell'uccello Dodo molto tempo fa.)

Il complemento e la grandezza del segno di 1 hanno due valori zero, +0 e -0, ciascuno con una rappresentazione unica. Il complemento di 2 ha solo un valore zero e una rappresentazione.

Ora, un campo di N bit può codificare 2 ^ N valori. Sottrai uno dal complemento di 2 e avrai 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Poiché la rappresentazione per zero è tutta zero bit e un segno + è zero, ci sarà un'altra possibile rappresentazione diversa da zero con il bit di segno impostato su 1.

Questo è un modo molto lungo di dire che il complemento di 2 rappresenta i valori nell'intervallo - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).

Il complemento di 1 in realtà ha un vantaggio rispetto al complemento di 2 se si eseguono calcoli di elaborazione del segnale digitale intero. Le operazioni del complemento di 1 sono intrinsecamente troncate verso zero. Il complemento di 2 si tronca verso l'infinito. L'ho imparato nel modo DURO ...

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.