2010-12-15 18 views
3
long a = (long)Math.pow(2, 32); 
// a = 4294967296 :) 

long a = (int)(long)Math.pow(2, 32); 
//a = 0 ?! 

long a = (int)Math.pow(2, 32); 
//a = 2147483647 WTF??!!! 

Der erste Ausdruck ist offensichtlich. a wird so gedruckt wie es ist.Java - TypeCasting Frage

Der zweite Ausdruck ist ein wenig verwirrend. Der große Wert ist

100000000000000000000000000000000 // 1 von 32 Nullen, 33 Bits in allen

Wenn sie in ein int gezwungen wird, wie sie als Null ist? Sollte es nicht die höchstwertige 1 als Vorzeichenbit nehmen und denken, dass die Zahl -2147483648 ist?

Auch, wenn die Doppel von Math.pow (4.294967296E9) zurückgegeben wird direkt in int umgewandelt, warum ist es 2147483647?

Ich lese Typcasting und Datentypen aus einem Buch, aber der Text erklärt nicht viel. Ich bin verwirrt. Bitte erläutern Sie, warum der zweite und der dritte Ausdruck diese Ergebnisse ergeben.

Antwort

3

Nein, da es alles nach den ersten 32 Bits abgeschnitten hat, so weit ich weiß - so hat es keine Ahnung über die 1 am Anfang (oder vielmehr am Ende).

4294967296 = 0x100000000 (in hexadezimal), und nur die ersten 32 Bits erhalten Sie Null.

Edit: Ich denke eigentlich, der andere hat mit einem speziellen Cast von Gleitkomma zu Int zu tun, das ist nicht das Gleiche wie durch eine lange und dann eine int, da es eine ganz andere Art von Besetzung ist Prozessor.

+0

Sie sagen, es schneidet alles nach den ersten 32 Bits ab. Aber die 1 ist innerhalb der "ersten 32 Bits", wenn sie als Binärzahl geschrieben wird. Was du sagst, wird wahr sein, wenn es 32 ZEROs gab und dann gab es eine 1. Aber es gibt 31 ZEROs und dann eine 1.Wenn es nach 32 Bits abgeschnitten wird, sollte 1 nicht abgeschnitten werden! –

+1

'2^32' ist eine 1, gefolgt von 32 Nullen in Binärform. Auf die gleiche Weise ist "10^10" eine Eins gefolgt von 10 Nullen in Dezimal. http://coppervinesoftware.com/2to32.png – jdmichal

+0

Hoppla! Mein Fehler. Entschuldigung :) Jetzt bekomme ich es ..: D +1 –

0

Aus der spec, Abschnitt 5.1.3. T ist eines von byte, short, char oder int.

Eine schmaler werdende Umwandlung einer vorzeichenbehafteten Ganzzahl in einen ganzzahligen Typ T verwirft einfach alle Bits außer der n niedrigster Ordnung, wobei n die Anzahl der für die Darstellung von Typ T verwendeten Bits ist. Zusätzlich zu einem möglichen Informationsverlust Die Größe des numerischen Werts kann dazu führen, dass das Vorzeichen des resultierenden Werts vom Vorzeichen des Eingabewerts abweicht.

Sie sind mit den Bits niedriger Ordnung zu enden, die in diesem Fall auf 0

+0

Wenn nur das verdammte Buch diese 4 Zeilen hätte. Eine ganze Seite Text, die alles andere beschreibt, ABER was Sie aus der Spezifikation zitierten. Danke für das Löschen :) +1 .. Ich bezweifelte, dass das Vorzeichenbit ignoriert wird, konnte es aber nicht bestätigen. –

+0

Ist der "spec" Link, den Sie zuletzt für Java gaben? –

+1

Der erste Link führt zur neuesten Ausgabe, der zweite zum vorherigen. Aber das Typcasting wird nicht geändert, neue Java-Versionen sind voll kompatibel, nur einige neue Dinge wie Generics wurden hinzugefügt. –

2

Abschnitt 5.1.3 der Java-Spezifikation deckt diese gehen macht.

http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363

Integer Verengung nimmt einfach den niedrigsten n Bits, was bedeutet, dass Zeichen, nicht in Betracht gezogen wird. Und in der Tat können negative Zahlen positiv werden. Aufweitung verfügt nicht über diese Eigenschaft und erweitert die Anzahl der Zeichen im erweiterten Typ.

int value = (int)(long)(Math.pow(2, 31)); // double to long to int 
System.out.println(value); // Prints -2147483648 

long lvalue = value; // int back to long 
System.out.println(value); // Prints -2147483648 again 

Gleitpunkt-Verengung ist ein viel komplizierteres Verfahren, das im Grunde die Anzahl auf die nächste Darstellungsart möglich in dem Ziel abschneidet, auf Null gerundet wird. In diesem Fall wird die Überlauf-/Unterlaufregel ausgelöst, die den Gleitkommawert in den durch den Typ darstellbaren maximalen/minimalen Wert umwandelt.

+0

+1 für die detaillierte Antwort von Teil 3 der Frage, obwohl sollten wir nicht mit der JLS 3e verknüpfen? http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3 –