webentwicklung-frage-antwort-db.com.de

Warum liegt der Bereich des vorzeichenbehafteten Bytes zwischen -128 und 127 (Zweierkomplement) und nicht zwischen -127 und 127?

Ich lese Warum ist der Bereich von Bytes -128 bis 127 in Java? heißt es

128 ist 10000000. Invertiert ist es 01111111, und wenn man eins hinzufügt, erhält man wieder 10000000

daraus folgt, dass -128 10000000 ist

+128 kann also nicht im Zweierkomplement in 8 Bits dargestellt werden, aber das bedeutet, wir können es in 9 Bits darstellen, also ist 128 010000000 und nimmt das Zweierkomplement -128 ist 110000000,

so ist die Darstellung von -128 10000000 oder 110000000? Ist das Repräsentationsbit abhängig?

Warum nicht einfach den unteren Bereich von -127 bis 8 Bit festlegen, anstatt -128 als 10000000 zu schreiben?

24
Anubha

Warum liegt der Bereich für vorzeichenlose Bytes zwischen -128 und 127?

Es ist nicht. Ein Byte ohne Vorzeichen (unter der Annahme von 8 Bit) liegt zwischen 0 und 255.

Der Bereich eines vorzeichenbehafteten Bytes unter Verwendung des Zweierkomplements reicht von -128 bis 127, direkt aus der Definition von Zweierkomplement :

01111111 = +127
01111110 = +126
01111101 = +125
...
00000001 = +1
00000000 =  0
11111111 = -1
...
10000010 = -126
10000001 = -127
10000000 = -128

so ist die Darstellung von -128 10000000 oder 110000000?

In 8-Bit ist es 10000000, in einer hypothetischen 9-Bit-Darstellung ist es 110000000.

Warum nicht einfach den unteren Bereich von -127 für 8 Bit festlegen?

Eine künstliche Einschränkung des Bereichs auf -127 würde nicht viel bewirken. Sie würden einen vollkommen gültigen Wert nicht zulassen und den Code im Allgemeinen komplexer machen (was würden Sie sonst mit dem Bitmuster tun 10000000?).

39

so ist die Darstellung von -128 10000000 oder 110000000? Ist das Repräsentationsbit abhängig?

Ja, die Komplementdarstellung von 2 ist bitabhängig

Warum nicht einfach den unteren Bereich von -127 auf 8 Bit setzen, anstatt -128 als 10000000 zu schreiben?

2 ^ 8 = 256. Unabhängig davon, welches Darstellungsschema Sie verwenden, sollte es 256 verschiedene Werte darstellen können.

Und Sie können einen Kreis zeichnen, um zu verstehen, wie gut das Komplementsystem von 2 ist.

Schauen Sie sich zuerst diese Tabelle an:

Bits    Unsigned 2's complement
00000000    0   0
00000001    1   1
00000010    2   2
01111110    126     126
01111111    127     127
10000000    128     −128
10000001    129     −127
10000010    130     −126
11111110    254     −2
11111111    255     −1

für das Komplementsystem von 2 können Sie einen Kreis zeichnen, um dieses System zu verstehen.

Hier ist die 4-Bit-Version. Sie können problemlos eine 8-Bit-Version für sich selbst entwickeln. Dieser Kreis repräsentiert, was das Komplementsystem dieser 2 tatsächlich ist. Es ist ein kreisförmiges System. Das bedeutet, dass seine Darstellung von der "Spanne" abhängt, die Sie ihm geben. Aus diesem Grund unterscheidet sich die 8-Bit-Version einer negativen Zahl von einer 16-Bit-Version derselben negativen Zahl. Sie können dieselbe negative Zahl in der im Kreis angegebenen 4-Bit-Version mit der in der Tabelle angegebenen 8-Bit-Version vergleichen.

                      0000  0
                 1111  -1     0001  1


        1110  -2                       0010  2




  1101  -3                                   0011  3



1100  -4                                       0100  4



  1011  -5                                   0101  5




        1010  -6                       0110  6


                 1001  -7     0111  7
                          1000  -8

Nebenbei bemerkt, die 2-Komplement-Arithmetik spielt eine gute Rolle bei Berechnungsspeichern mit "fester" Breite in Computern (Register, Speicher usw.).

Bei Computern der ersten Generation bestand die Tendenz, native Dezimalarithmetik bereitzustellen. Dies wurde jedoch schnell zugunsten eines "ergänzten" oder "kreisförmigen" Schemas aufgegeben, da die Dezimalarithmetik aus der Sicht eines Computers bizarr ist. Wir finden es natürlich, weil "wir 10 Finger haben". Diese Finger waren das früheste Berechnungswerkzeug unseres Vorfahren. Deshalb finden wir das Dezimalsystem so natürlich. Es ist in unsere Gene eingebaut.

17
Aftnix

Die Alternativen zum Zweierkomplement wären

  • jemandes Komplement , das aufgrund seiner "negativen Null" Probleme hat
  • Vorzeichen/Größe , das auch eine negative Null hat
  • weisen Sie 10000000 keine Bedeutung zu. In diesem Fall müssen viele Funktionen, die 8-Bit-Ganzzahlen mit Vorzeichen akzeptieren, auf diesen ungültigen Wert prüfen, was Zeit verschwendet. (Es sei denn, Ihr Code läuft auf hypothetischer Hardware, die dieses Bitmuster als ganzzahlige NaN behandelt.)

Es ist einfacher, diesem Bitmuster nur eine Bedeutung zuzuweisen, und die natürliche Bedeutung in der Zweierkomplementdarstellung ist -128.

Zum Beispiel wird im Zweierkomplement geprüft, ob negativ ist, um zu prüfen, ob sein höchstes Bit gesetzt ist. In einer Variante, in der 10000000 Ungültig ist, ist es (Pseudocode)

if (highest_bit_zero(x))
    return false;
else if (x == 0b10000000)
    ERROR
else
    return true;

Sie entscheiden, wie mit dem Fehler umgegangen werden soll :)

6
Fred Foo

so ist die Darstellung von -128 10000000 oder 110000000? Ist das Repräsentationsbit abhängig?

In einer 9-Bit-Welt wäre es 110000000. In einer 16-Bit-Welt wäre es 1111111110000000. Zumindest, solange es sich um das Komplement zweier handelt.

Warum nicht einfach den unteren Bereich -127 für 8 Bit festlegen, anstatt -128 als 10000000 zu schreiben?

Wie Larsmans betonte, würden Sie am Ende einen "ungültigen" Wert erhalten, gegen den Sie ständig prüfen müssten. Die Zweiteiligkeit wurde gewählt, weil es für die ALU so einfach ist, damit umzugehen. Genauso wie die Bytebreiten zur Zweierpotenz gewählt wurden (was auch nicht immer der Fall war). Auf Hardware-Ebene ist das Hinzufügen von Zweierkomplementen identisch mit dem Hinzufügen von Zweierkomplementen ohne Vorzeichen, sodass keine speziellen Anweisungen oder zusätzliche Hardware erforderlich sind (im Gegensatz zum eigenen Komplement).

Wenn die Dinge so sind, wie sie sind, sind alle Werte mit dem höchsten gesetzten Bit negativ, alle Werte mit dem höchsten nicht gesetzten Bit sind nicht negativ (positiv oder null). Einfach, nicht wahr? Der negative Bereich, der um eins größer als der positive Bereich ist, ist einfach ein Artefakt des Versuchs, das Zweierkomplement einfach zu halten.

3
DevSolar

Grund, warum Sie keinen Bereich von enter image description here bis enter image description here .

Es sieht aus wie enter image description here und enter image description here werden durch dasselbe Muster dargestellt. Das ist nicht gut. Eine Ganzzahl ungleich Null und ihr Negativ können nicht beide durch dasselbe Muster dargestellt werden. So enter image description here kann nicht in acht Bits dargestellt werden. Die maximale positive Ganzzahl, die in acht Bits dargestellt werden kann, ist enter image description here .

Welche Zahl wird durch 1000 0000 dargestellt? Fügen Sie die Darstellung von enter image description here dazu:

enter image description here

Eine gute Wahl für? ist enter image description here . Daher steht 1000 0000 für enter image description here . Acht Bits können verwendet werden, um die Zahlen darzustellen enter image description here ... 0 ... enter image description here .

enter image description here

Der Bereich von Ganzzahlen, der mit dem Zweierkomplement in acht Bits dargestellt werden kann, ist beispielsweise:

Example

Beachten Sie, dass eine weitere negative Ganzzahl dargestellt werden kann als positive Ganzzahlen.

Quelle: - http://programmedlessons.org/AssemblyTutorial/Chapter-08/ass08_20.html

2
Varun