Warum ist char c = (char)65.8;
in Java erlaubt?
Sollte es keinen Fehler verursachen, da 65.8
kein exakter Unicode-Wert ist? Ich verstehe, dass das Double zu einer ganzen Zahl gekürzt wird, in diesem Fall 65
, aber es scheint mir ein schlechter Entwurf zu sein, dem Programmierer zu erlauben, einen solchen Cast zu machen.
Dies wird Eingrenzendes Casting genannt.
Von oracle docs
:
22 spezifische Konvertierungen von primitiven Typen werden als Verengung bezeichnet Grundlegende Konvertierungen:
kurz zu Byte oder Zeichen
char zu Byte oder kurz
int in Byte, kurz oder char
long zu Byte, short, char oder int
Float zu Byte, Kurz, Char, Int oder Long
double to byte, kurz, char, int, long oder float
Eine verkleinerte primitive Konvertierung kann Informationen über die Gesamtgröße eines numerischen Werts und kann auch die Genauigkeit verlieren und Bereich.
In Java gibt es zwei grundlegende Arten von Typkonvertierungen: Erweiterung und Einschränkung .
A widening conversion
tritt auf, wenn Sie von einem Typ mit einem kleineren (oder schmaleren) Typ in einen größeren (oder größeren) Bereich konvertieren. Aus diesem Grund besteht keine Möglichkeit für Datenverluste und die Konvertierung wird als "sicher" betrachtet.
A narrowing conversion
tritt auf, wenn Sie von einem Typ mit größerem (oder breiterem) Typ in einen kleineren (oder schmaleren) Bereich umwandeln. Da wir die Reichweite verringern, besteht die Gefahr eines Datenverlusts. Daher wird diese Konvertierung als "unsicher"
Die Konvertierung von Byte nach char ist ein Sonderfall und steht gleichzeitig für Erweiterung und Einschränkung . Die Konvertierung beginnt mit der Konvertierung des Byte in ein int und dann wird das int in das Zeichen konvertiert. p>
Ein Grund, warum ich mir vorstellen kann, warum die Eingrenzung der Typumwandlung nicht zu einem Fehler / einer Ausnahme führt, ist eine bequeme / einfache / schnelle Typkonvertierung in den Fällen, in denen keine Daten verloren gehen. Der Compiler überlässt es uns, dass konvertierte Daten in den kleineren Bereich passen. Es ist auch nützlich, wenn wir Werte wie den Wert von double
(durch Typ-Casting in int
) schnell abschneiden wollen.
es passiert nicht automatisch bei der Zuweisung: das wäre ein Kompilierungsfehler.
Die Tatsache, dass der Programmierer eine bewusste Entscheidung trifft (z. B. die Art der Besetzung), bedeutet, dass er die Möglichkeit und die Verantwortung für eine mögliche Kürzung in Betracht zieht.
Wie kann der dumme Computer wissen, was beabsichtigt war?
%Vor%Es kann passieren, dass Sie während einer Berechnung einige komplexe Berechnungen durchführen, die Doppelarithmetik beinhalten, und schließlich auf den endgültigen Wert, wenden Sie die Bildung und Anzeige als ein Zeichen an. Was ist los?