Warum ist der Mindestwert für Ints, Doubles usw. 1 weiter von Null entfernt als der positive Wert?


10

Ich weiß, dass es etwas mit dem 2er-Komplement und dem Hinzufügen von 1 zu tun hat, aber ich verstehe nicht wirklich, wie man eine weitere Zahl mit der gleichen Anzahl von Bits codieren kann, wenn es um negative Zahlen geht.


3
Der wirklich böse Teil davon ist, dass Abs (MinValue) negativ ist.
OldFart

1
in Java ist Double.MIN_VALUE der kleinste positive Wert, und die (reellen) Zahlen, die am weitesten von Null entfernt sind, haben die gleiche Größe (da sie ein richtiges Vorzeichenbit haben)
Ratschenfreak

Antworten:


16

Denken Sie in diesen Begriffen darüber nach. Nehmen Sie eine 2-Bit-Zahl mit einem vorangestellten Vorzeichen:

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

Lassen Sie uns nun einige Negative haben:

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

Warten Sie, wir haben auch

100 ... 

Es muss negativ sein, da das Vorzeichenbit 1 ist. Logischerweise muss es also -4 sein.

(Bearbeiten: Wie WorldEngineer zu Recht hervorhebt , funktionieren nicht alle Nummerierungssysteme auf diese Weise - aber diejenigen, nach denen Sie fragen, tun dies.)


11

Weil es im ganzzahligen Bereich nicht zwei Klassen von Zahlen gibt, sondern drei: negative Zahlen, Null und positive Zahlen. Null muss einen Slot einnehmen (wäre ziemlich unpraktisch, um nicht Null darstellen zu können ...), also muss entweder die positive oder die negative Klasse einen Slot aufgeben. Die Tatsache, dass es normalerweise der positive Bereich ist, der dieses Opfer bringen muss, ist bis zu einem gewissen Grad willkürlich, aber auf der Ebene der Bitmanipulationen gibt es einige Dinge, die diese Entscheidung bequemer macht.


Es sind nicht nur kleine Manipulationen. Die Menge der vorzeichenbehafteten 32-Bit-Zahlen ist die Menge der Zahlen, deren Binärdarstellung in allen Bits nach dem 31. den gleichen Wert hat, und eine solche Zahl hat eine unendliche Menge von Einsen, gefolgt von 31 Nullen. Die additive Umkehrung dieser Zahl, eine unendliche Folge von Nullen, gefolgt von einer einzelnen 1 und 31 Nullen, passt nicht zu dem Muster, das für vorzeichenbehaftete Werte erforderlich ist.
Superkatze

4

Grundsätzlich gibt es drei Möglichkeiten, vorzeichenbehaftete Ganzzahlen binär darzustellen: das 2er-Komplement, das 1er-Komplement und die Vorzeichengröße. (Biquinary ist vor langer Zeit den Weg des Dodo-Vogels gegangen.)

Das Komplement und die Vorzeichengröße von 1 haben zwei Nullwerte, +0 und -0, mit jeweils einer eindeutigen Darstellung. Das Komplement von 2 hat nur einen Nullwert und eine Darstellung.

Nun kann ein Feld von N Bits 2 ^ N Werte codieren. Subtrahieren Sie eins im Zweierkomplement, und Sie haben 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Da die Darstellung für Null alle Nullbits ist und ein + -Zeichen Null ist, Es wird eine weitere mögliche Darstellung ungleich Null geben, wobei das Vorzeichenbit auf 1 gesetzt ist.

Dies ist eine sehr langwierige Art zu sagen, dass das Komplement von 2 Werte im Bereich - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1) darstellt.

Das Komplement von 1 hat tatsächlich einen Vorteil gegenüber dem Komplement von 2, wenn Sie ganzzahlige digitale Signalverarbeitungsberechnungen durchführen. Die Komplementoperationen von 1 werden von Natur aus gegen Null abgeschnitten. Das 2er-Komplement schneidet in Richtung -Infinity ab. Ich habe das auf die harte Weise gelernt ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.