Ich versuche zu verstehen, wie Java Integer intern speichert. Ich weiß, dass alle primitiven Java-Ganzzahlen signiert sind (außer kurz?). Das bedeutet, dass in einem Byte ein Bit weniger für die Nummer verfügbar ist.
Meine Frage ist, werden alle ganzen Zahlen (positiv und negativ) als Zweierkomplement gespeichert oder sind nur negative Zahlen im Zweierkomplement?
Ich sehe, dass die Spezifikationen sagt x bit two's complement number
. Aber ich werde oft verwirrt.
Zum Beispiel:
int x = 15; // Stored as binary as is? 00000000 00000000 00000000 00001111?
int y = -22; // Stored as two complemented value? 11111111 11111111 11111111 11101010
Bearbeiten
Deutlich sein, x = 15
In binary as is: `00000000 00000000 00000000 00001111'
Two's complement: `11111111 11111111 11111111 11110001`
Wenn Ihre Antwort lautet, dass all
Zahlen als Zweierkomplement gespeichert sind, dann:
int x = 15; // 11111111 11111111 11111111 11110001
int y = -22 // 11111111 11111111 11111111 11101010
Die Verwirrung hier ist wieder das Zeichen sagt, beide sind negative Zahlen. Kann ich es falsch verstehen / missverstehen?
Bearbeiten Ich bin mir nicht sicher, ob meine Frage verwirrend ist. Gezwungen, die Frage zu isolieren:
Meine Frage genau: Werden positive Zahlen gespeichert, binary as is
während negative Zahlen gespeichert werden two's complement
?
Einige sagten, dass alle im Zweierkomplement gespeichert sind und eine Antwort besagt, dass nur negative Zahlen als Zweierkomplement gespeichert sind.
x
undy
sind richtig.Antworten:
Beginnen wir mit der Zusammenfassung der primitiven Java-Datentypen:
Byte : Der Byte-Datentyp ist eine 8-Bit -Zweierkomplement-Ganzzahl mit Vorzeichen .
Kurz : Der kurze Datentyp ist eine 16-Bit -Zweierkomplement-Ganzzahl mit Vorzeichen .
int: Der Int-Datentyp ist eine 32-Bit -Zweierkomplement-Ganzzahl mit Vorzeichen .
long: Der Long-Datentyp ist eine 64-Bit-Ganzzahl mit zwei Vorzeichen .
float: Der Float-Datentyp ist ein 32-Bit-IEEE 754-Gleitkomma mit einfacher Genauigkeit .
double : double data type ist ein 64-Bit-IEEE 754-Gleitkomma mit doppelter Genauigkeit .
Boolescher Wert: Der boolesche Datentyp repräsentiert ein Informationsbit .
Der Datentyp char: char ist ein einzelnes 16-Bit-Unicode-Zeichen .
Quelle
Zwei ergänzen
"Das gute Beispiel aus dem Wiki ist, dass die Beziehung zum Zweierkomplement durch die Feststellung realisiert wird, dass 256 = 255 + 1 ist und (255 - x) das Einerkomplement von x ist
0000 0111 = 7 Zweierkomplement ist 1111 1001 = -7
Die Art und Weise, wie es funktioniert, ist, dass das MSB (das höchstwertige Bit) einen negativen Wert erhält, also im obigen Fall
Positive ganze Zahlen werden im Allgemeinen als einfache Binärzahlen gespeichert (1 ist 1, 10 ist 2, 11 ist 3 usw.).
Negative ganze Zahlen werden als Zweierkomplement ihres Absolutwerts gespeichert. Das Zweierkomplement einer positiven Zahl ist bei Verwendung dieser Notation eine negative Zahl.
Quelle
Da ich für diese Antwort einige Punkte erhalten habe, habe ich beschlossen, weitere Informationen hinzuzufügen.
Eine detailliertere Antwort:
Unter anderem gibt es vier Hauptansätze, um positive und negative Zahlen in Binärzahlen darzustellen, nämlich:
1. Signierte Größe
Verwendet das höchstwertige Bit zur Darstellung des Vorzeichens, die verbleibenden Bits zur Darstellung des Absolutwerts. Wobei 0 eine positive Zahl und 1 eine negative Zahl darstellt , Beispiel:
Diese Darstellung ist einfacher. Sie können Binärzahlen jedoch nicht auf die gleiche Weise wie Dezimalzahlen hinzufügen, was die Implementierung auf Hardwareebene erschwert. Darüber hinaus verwendet dieser Ansatz zwei binäre Muster, um die Werte 0, 100 ... 0 und 0 ... 0 darzustellen.
2. Die Ergänzung
In dieser Darstellung invertieren wir alle Bits einer bestimmten Zahl, um ihre Komplementarität herauszufinden. Beispielsweise:
Das Problem dieser Darstellung besteht darin, dass noch zwei Bitmuster existieren, um die 0 (00..0 und 11..1) darzustellen.
3. Zweierkomplement
Um das Negativ einer Zahl zu finden, invertieren wir in dieser Darstellung alle Bits und fügen dann ein Bit hinzu. Das Hinzufügen eines Bits löst das Problem, dass zwei Bitmuster 0 darstellen. In dieser Darstellung haben wir nur eines (00 ... 0).
Zum Beispiel wollen wir die binäre negative Darstellung von 4 (dezimal) mit 4 Bits finden. Zuerst konvertieren wir 4 in binär:
dann invertieren wir alle Bits
Zum Schluss fügen wir noch ein bisschen hinzu
1100 entspricht also -4 in Dezimalzahl, wenn wir eine binäre Zwei-Komplement-Darstellung mit 4 Bits verwenden.
Ein schnellerer Weg, das Komplementäre zu finden, besteht darin, das erste Bit als Wert 1 zu fixieren und die verbleibenden Bits zu invertieren. Im obigen Beispiel wäre es ungefähr so:
Die Zweierkomplementdarstellung enthält nicht nur eine Darstellung für 0, sondern fügt auch zwei Binärwerte auf dieselbe Weise hinzu wie in dezimalen, geraden Zahlen mit unterschiedlichen Vorzeichen. Es ist jedoch notwendig, nach Überlauffällen zu suchen.
4. Bias
Diese Darstellung wird verwendet, um den Exponenten in der IEEE 754-Norm für Gleitkommazahlen darzustellen. Es hat den Vorteil, dass der Binärwert mit allen Bits auf Null den kleinsten Wert darstellt. Und der Binärwert mit allen Bits zu 1 repräsentiert den größten Wert. Wie der Name schon sagt, wird der Wert binär (positiv oder negativ) binär mit n Bits mit einer Vorspannung (normalerweise 2 ^ (n-1) oder 2 ^ (n-1) -1) codiert.
Wenn wir also 8 Bits verwenden, wird der Wert 1 in Dezimalzahl in Binärform unter Verwendung einer Vorspannung von 2 ^ (n-1) durch den Wert dargestellt:
quelle
binary as is
während -ve Nummern gespeichert werdentwo's complement
?Java-Ganzzahlen bestehen aus 32 Bit und sind immer signiert. Dies bedeutet, dass das höchstwertige Bit (MSB) als Vorzeichenbit fungiert. Die durch an dargestellte Ganzzahl
int
ist nichts anderes als die gewichtete Summe der Bits. Die Gewichte sind wie folgt zugeordnet:Beachten Sie, dass das Gewicht des MSB negativ ist (das größtmögliche Negativ tatsächlich). Wenn dieses Bit aktiviert ist, wird die ganze Zahl (die gewichtete Summe) negativ.
Simulieren wir es mit 4-Bit-Zahlen:
Das Zweierkomplement ist also kein exklusives Schema für die Darstellung negativer Ganzzahlen, sondern wir können sagen, dass die binäre Darstellung von Ganzzahlen immer gleich ist, wir negieren nur das Gewicht des höchstwertigen Bits. Und dieses Bit bestimmt das Vorzeichen der ganzen Zahl.
In C gibt es ein Schlüsselwort
unsigned
(in Java nicht verfügbar), das zum Deklarieren verwendet werden kannunsigned int x;
. In den Ganzzahlen ohne Vorzeichen ist das Gewicht des MSB eher positiv (2^31
) als negativ. In diesem Fall wird der Bereich einesunsigned int
ist0
zu2^32 - 1
, während einint
Bereich hat-2^31
zu2^31 - 1
.Unter einem anderen Gesichtspunkt, wenn Sie das Zweierkomplement
x
als~x + 1
(NICHT x plus eins) betrachten, ist hier die Erklärung:Für jede
x
,~x
ist nur das bitweise Inverse vonx
, also überall dort , wox
eine hat1
-Bit,~x
eine hat0
-Bit gibt (und umgekehrt). Wenn Sie diese addieren, gibt es keinen Übertrag in der Addition und die Summe ist nur eine ganze Zahl, von der jedes Bit ist1
.Für 32-Bit-Ganzzahlen:
Das
1
Bit ganz links wird einfach verworfen, da es nicht in 32-Bit passt (ganzzahliger Überlauf). So,Sie können also sehen, dass das Negative
x
durch dargestellt werden kann~x + 1
, was wir das Komplement der beiden nennenx
.quelle
binary as is
während -ve Nummern gespeichert werdentwo's complement
?Ich habe das folgende Programm ausgeführt, um es zu wissen
Ausgabe ist
Aus der Ausgabe geht hervor, dass das Zweierkomplement verwendet wurde.
quelle
11111111 11111111 11111111 11110110
. Ihre Drucke, während Binär wie für 10 1010 ist. Also werden nur -ve Zahlen als Zweierkomplement gespeichert?Oracle bietet einige Dokumentationen zu Java- Datentypen , die Sie möglicherweise interessant finden. Speziell:
Übrigens wird kurz auch als Zweierkomplement gespeichert.
quelle
Gemäß diesem Dokument werden alle Ganzzahlen signiert und im Zweierkomplementformat für Java gespeichert. Nicht sicher von seiner Zuverlässigkeit ..
quelle
zB) beim Speichern von -10 dann
Beim Abrufen wurde festgestellt, dass MSB auf 1 gesetzt ist. Es ist also negativ, nein. Und das Komplement von 2 wird anders als MSB durchgeführt.
Beachten Sie auch, dass beim Umwandeln von int / short in Byte nur das letzte Byte zusammen mit dem MSB des letzten Bytes berücksichtigt wird.
Nehmen Sie das Beispiel "-130" kurz, es könnte wie unten gespeichert werden
Jetzt hat das Byte-Casting das letzte Byte genommen, das 0111 1110 ist. (0-MSB) Da MSB sagt, dass es + ve Wert ist, wird es so genommen, wie es ist. Welches ist 126. (+ ve).
Nehmen Sie ein anderes Beispiel "130" kurz, es könnte wie unten gespeichert werden
Jetzt hat das Byte-Casting das letzte Byte genommen, das 1000 0010 ist. (1 = MSB) Da MSB angibt, dass es sich um einen -ve-Wert handelt, wird das Komplement von 2 ausgeführt und eine negative Zahl zurückgegeben. In diesem Fall wird -126 zurückgegeben.
ähnlich
Aber
UND
Warum wird das Zweierkomplement verwendet, um negative Zahlen darzustellen?
Was ist "2's Complement"?
quelle
Das höchstwertige Bit (32.) zeigt an, dass die Zahl positiv oder negativ ist. Wenn es 0 ist, bedeutet dies, dass die Zahl positiv ist und in ihrer tatsächlichen Binärdarstellung gespeichert wird. Wenn es jedoch 1 ist, bedeutet dies, dass die Zahl negativ ist und in der Zweierkomplementdarstellung gespeichert wird. Wenn wir also dem 32. Bit eine Gewichtung von -2 ^ 32 geben, während wir den ganzzahligen Wert aus seiner binären Darstellung wiederherstellen, erhalten wir die tatsächliche Antwort.
quelle
Vielen Dank, dreamcrash für die Antwort https://stackoverflow.com/a/13422442/1065835 ; Auf der Wiki-Seite geben sie ein Beispiel, das mir geholfen hat, die binäre Darstellung des negativen Gegenstücks einer positiven Zahl herauszufinden.
quelle
positive Zahlen werden direkt als binär gespeichert. Das Kompliment von 2 ist für negative Zahlen erforderlich.
beispielsweise:
15: 00000000 00000000 00000000 00001111
-15: 11111111 11111111 11111111 11110001
Hier ist der Unterschied im vorzeichenbehafteten Bit.
quelle
Für eine positive ganze Zahl 2 ist der Komplementwert mit dem MSB-Bit 0 identisch
(like +14 2'complement is 01110)
.Nur für eine negative ganze Zahl berechnen wir den 2'-Komplementwert
(-14= 10001+1 = 10010)
.Die endgültige Antwort lautet also, dass beide Werte
(+ve and -ve)
nur in 2'-Komplementform gespeichert sind.quelle