int in long-Zuordnung
Habe ich versucht, dieses int-und long-Konvertierung, wo ich versucht habe die Zuweisung einer int
variable zu einem long
variable. Der code ist wie folgt:
public static void main(String []args){
int i = 1024;
long j = i;
long k = i*i*i*i;
System.out.println("j= " +j+ ", k= " +k);
}
So, während der Druck j
es gab einfach eine Ausgabe von 1024
. Aber beim drucken k
es zeigte sich ein überlauf (k
=0). Ich habe aussortiert dieses problem durch die Verwendung dieser Technik, wo ich explizit gecastet jede i
zu long
. also
public static void main(String []args){
int i = 1024;
long j = i;
long k = ((long)i)*((long)i)*((long)i)*((long)i);
System.out.println("j= " +j+ ", k= " +k);
}
Nun, er zeigte die richtigen Werte der beiden j
und k
.
Also, ich wollte wissen, warum wird das benötigt, um Darsteller int
im zweiten Falle aber nicht in die erste. k
, ein long
können, behalten Sie diesen Wert nach dieser schweren Auftrag. Aber, warum ist es nicht richtig zugewiesen wurde?
InformationsquelleAutor der Frage Shashish Chandra | 2014-07-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund dafür ist, dass Ihre Linie
gedacht werden kann, wie
... oder
So, wenn einer von
kn
überläuft, erhalten Sie die Fehlermeldung.Wenn Sie tun, Ihr CASTET, Sie sind offensichtlich zur Umgehung dieses problem, indem Sie immer die Multiplikation
long
s zusammen.Natürlich die einfachste Modifikation, um Ihr erstes Programm zu definieren
i
alslong
sofort, anstelle einerint
.InformationsquelleAutor der Antwort dav_i
Dieses problem basiert auf der Tatsache, dass verschiedene Arten verwenden unterschiedliche Menge an Speicher. int und long sind beide Integer-zahlen, der Unterschied ist, dass int ist 4 byteswährend long ist 8 Byte.
Können ändern Sie Ihren code ein wenig:
Den code oben zeigt, dass, wenn Sie haben vervielfacht, ich 3 mal das Ergebnis ist ein Wert, der kleiner als Integer.MAX_VALUE (2147483647), und wenn Sie multiplizieren Sie 4-mal das Ergebnis 0 ist, da es nicht genug Platz in den Armen 4 bytes der Multiplikatoren. 🙂
Aber Sie können sehen, dass, wenn die Multiplikatoren (Rechte Seite, j) sind vom Typ long, wird der korrekte Wert ist gedruckt, und die letzten Druck zeigt an, dass die Aussage k < Integer.MAX_VALUE ist falsch, was ist der Grund für Ihre null. 🙂
InformationsquelleAutor der Antwort Ranic
i*i*i*i
ist ein alle int-Multiplikation, so dass der resultierende integer-Wert darstellt, nur (Die ist voll in Ihrem Fall). für eine lange daraus resultierenden Sie nur umwandeln müssen, einer von Ihnen zu lange, so ist dies ausreichendInformationsquelleAutor der Antwort Sanjeev
In der ersten wird der Wert von i ist ein int und integer multipllication passiert und
i*i*i*i
Ergebnis ist integer und damit dieinteger-überlauf.
Wo, wie im zweiten Fall werden Sie explizit sagen/machen, das Ergebnis als
long
.InformationsquelleAutor der Antwort ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ
1099511627776
das ist das Ergebnis der Multiplikation ist>Integer.MAX_VALUE
wie es ist Integer-Multiplikation an, so nachi*i*i
Wert wäre1073741824
aber nach Multiplikation mit1024
wird es aus der Auswahl, die Ursachen integer-überlauf und k 0.i
zulong
1L
(1L*i*i*i*i
), Aber NICHTi*i*i*i*1L
i*i*i
zu lange und als multiplizieren miti
wie dieselong k =(k=i*i*i)*i;
InformationsquelleAutor der Antwort coder-croc