2016-07-02 5 views
1

Kürzlich, während ich durch Typumwandlung Konzept in Java ging, habe ich gesehen, dass Typ Casting von größeren Variablen zu kleineren Variablen Ergebnisse der Modulo der größeren Variable durch den Bereich der kleineren Variablen. Kann jemand bitte dies im Detail erklären, warum dies der Fall ist und gilt es für jede explizite Typumwandlung ?.Warum Casting von größeren Variable zu kleineren Variablen Ergebnisse in Modulo der größeren Variablen durch den Bereich der kleineren Variablen

 class conversion { 
    public static void main(String args[]) 
    { 
     double a = 295.04; 
     int b = 300; 
     byte c = (byte) a; 
     byte d = (byte) b; 
     System.out.println(c + " " + d); 
    } 
} 

Der obige Code gibt die Antwort von d als 44 seit 300 Modulo 256 ist 44.Please erklären, warum dies der Fall ist, und auch, was passiert mit dem Wert von c?

+0

hast du jemals einen Gedanken gemacht, wenn b = 128, dann modulo funktioniert, aber warum negativ ??? überprüfen Sie, dass –

+0

Kommentar 2: und auch, wenn b = 255, dann funktioniert modulo nicht, überprüfen Sie das auch. –

+0

yeah ich denke, ich weiß, Antwort für that.Sine Byte Datentyp Bereich ist 0 bis 127, Überlauf tritt auf, wenn wir 127 überqueren, so dass es von -128 bis -1.this ist, warum wir nicht die richtige Antwort für b = bekommen 255.Korrekt mich, wenn ich falsch liege? –

Antwort

1

Es ist eine Design-Entscheidung, die die C-Programmiersprache und die Möglichkeit zu Cs Vorgänger ebenfalls zurückführt.

Was passiert, wenn Sie von einem größeren Integer-Typ in einen kleineren Integer-Typ konvertieren, ist, dass die oberen Bits abgeschnitten werden.

Warum? Ursprünglich (und aktuell), weil das Hardware-Integer-Befehle unterstützen. Der logische "andere" Weg dies zu tun (d. H. NICHT die Art und Weise, wie Java Integer-Verengungen definiert) wäre die Konvertierung in den größten (oder kleinsten) Wert, der im kleineren Typ dargestellt werden kann; z.B.

// equivalent to real thin in real java 
    // b = (byte) (Math.max(Math.min(i, 127), -128)) 

würde +127 als Wert von b geben. Dies geschieht übrigens, wenn Sie einen Fließkommawert in einen ganzzahligen Wert konvertieren und der Wert zu groß ist. Das passiert in Ihrem c Beispiel.


Sie haben auch gesagt:

Der obige Code die Antwort von d als 44 gibt seit 300 Modulo 256 ist 44.

In der Tat wäre die korrekte Berechnung sein:

int d = ((b + 128) % 256) - 128; 

Das ist, weil der Bereich von Java byte Typ -1 ist 28 bis +127.

+0

Aber der Wert von b in Ihrem Beispiel sollte 44 richtig sein? –

+0

die "andere Weise" Erklärung ist gut, aber die Ausgabe hier zeigt 'c' ist' 39' (das ist '295 mod 256'), ich denke, dass das 'double' zuerst in ein' int' umgewandelt wird, dann zu a 'Byte'. So wird es zumindest in C++ gemacht. – Mike

+0

Können Sie erklären, warum wir die Modulo-Division durchführen müssen, um das Ergebnis zu erhalten? –

Verwandte Themen