Typumwandlung Typ
Im Informatik, Typumwandlung Typ,[1][2] Typ Casting,[1][3] Tippen Sie Zwang,[3] und Typ Jonglieren[4][5] sind unterschiedliche Wege, um eine zu ändern Ausdruck von einem Datentyp zum anderen. Ein Beispiel wäre die Umwandlung von a ganze Zahl Wert in a schwimmender Punkt Wert oder seine Textdarstellung als Saite, und umgekehrt. Typ -Conversions können bestimmte Funktionen von nutzen Geben Sie Hierarchien ein oder Datendarstellungen. Zwei wichtige Aspekte einer Typumwandlung sind, ob es passiert implizit (automatisch) oder ausdrücklich,[1][6] und ob die zugrunde liegende Datenrepräsentation von einer Darstellung in eine andere umgewandelt wird oder eine bestimmte Darstellung lediglich ist neu interpretiert als Darstellung eines anderen Datentyps.[6][7] Im Allgemeinen beide Primitive und Verbunddatentypen kann konvertiert werden.
Jeder Programmiersprache Hat seine eigenen Regeln, wie Typen konvertiert werden können. Sprachen mit Starke Typisierung Normalerweise wenig implizite Konvertierung durchführen und die Neuinterpretation von Darstellungen entmutigen, während Sprachen mit schwache Typisierung Führen Sie viele implizite Konvertierungen zwischen Datentypen durch. Schwache Schreibsprache ermöglichen häufig das Fordern Compiler Um ein Datenelement willkürlich als unterschiedliche Darstellungen zu interpretieren, kann dies ein nicht offener Programmierfehler oder eine technische Methode sein, um direkt mit der zugrunde liegenden Hardware umzugehen.
In den meisten Sprachen das Wort Zwang wird verwendet, um eine zu bezeichnen implizit Umwandlung, entweder während der Zusammenstellung oder während Laufzeit. Beispielsweise wandelt der Compiler in einem Expression, der Ganzzahl- und Schwimmpunktzahlen (wie 5 + 0,1) mischt, automatisch die ganzzahlige Darstellung in schwimmende Punktdarstellung um, sodass die Fraktionen nicht verloren gehen. Explizite Typkonvertierungen werden entweder durch das Schreiben zusätzlicher Code angezeigt (z. B. Hinzufügen von Typ-Kennern oder integriertem Aufruf Routinen) oder durch Codieren von Konvertierungsroutinen, die der Compiler verwenden kann, wenn er sonst mit einem Typ -Missverhältnis stoppen würde.
In den meisten Algol-ähnliche Sprachen, wie z. Pascal, Modula-2, Ada und Delphi, Wandlung und Casting sind deutlich unterschiedliche Konzepte. In diesen Sprachen, Wandlung Bezieht sich auf implizit oder auf explizit einen Wert von einem Datentypspeicherformat auf ein anderes, z. Eine 16-Bit-Ganzzahl zu einer 32-Bit-Ganzzahl. Der Speicherbedarf kann sich infolge der Konvertierung ändern, einschließlich eines möglichen Verlusts von Präzision oder Kürzung. Das Wort gießenAndererseits bezieht sich darauf, das explizit zu ändern Deutung des Bitmuster einen Wert von einem Typ zum anderen darstellen. Beispielsweise können 32 zusammenhängende Bits als Array von 32 Booleschen, eine 4-Byte-Saite, eine nicht signierte 32-Bit-Ganzzahl oder einen IEEE-Einzelgenauigkeitspunktwert behandelt werden. Da die gespeicherten Bits nie geändert werden, muss der Programmierer auf niedrige Ebenen wie Repräsentationsformat, Byte -Ordnung und Ausrichtungsbedürfnisse sinnvoll sein, um sinnvoll zu wirken.
In der C -Familie der Sprachen und Algol 68, das Wort gießen bezieht sich normalerweise auf eine explizit Typumwandlung (im Gegensatz zu einer impliziten Konvertierung), was zu Unklarheiten darüber führt, ob dies eine Neuinterpretation eines Bit-Muster- oder einer realen Umwandlung von Datenrepräsentation ist. Wichtiger ist die Vielzahl von Möglichkeiten und Regeln, die für den Datentyp (oder die Klasse) gelten, und wie ein Zeiger vom Compiler in Fällen wie Object (Klasse) Vererbung angepasst werden kann.
Sprachvergleich
C-ähnliche Sprachen
Implizite Typumwandlung
Implizite Typumwandlung, auch bekannt als Zwang oder Typ Jonglieren, ist eine automatische Typumwandlung durch die Compiler. Etwas Programmiersprachen Compilern ermöglichen, Zwang zu versorgen; Andere benötigen es.
In einem gemischten Ausdruck, Daten von einem oder mehreren Subtypen kann sein umgewandelt zu einem Supertyp nach Bedarf bei Laufzeit so dass das Programm korrekt ausgeführt wird. Zum Beispiel ist das Folgende legal C Sprache Code:
doppelt d; lang l; int i; wenn (d > i) d = i; wenn (i > l) l = i; wenn (d == l) d *= 2;
Obwohl d, l, und i Zu den verschiedenen Datentypen gehören sie bei jedem Vergleich oder Zuordnungen automatisch in gleiche Datentypen konvertiert. Dieses Verhalten sollte mit Vorsicht verwendet werden wie ungewollte Konsequenzen kann entstehen. Daten können verloren gehen, wenn die Darstellungen vom Gleitpunkt in die Ganzzahl konvertiert werden, da die Bruchkomponenten der Gleitkommawerte verkürzt werden (auf Null abgerundet). Umgekehrt kann die Präzision verloren gehen, wenn die Darstellungen von Ganzzahl zu Floating-Punkt konvertiert werden, da ein Gleitkomma-Typ möglicherweise keinen Ganzzahl-Typ darstellen kann. Zum Beispiel, float
könnte ein sein IEEE 754 Einzelgenauigkeitstyp, der die Ganzzahl 16777217 nicht genau darstellen kann, während ein 32-Bit-Ganzzahltyp kann. Dies kann zu einem unintuitiven Verhalten führen, wie der folgende Code zeigt:
#enthalten int hauptsächlich(Leere) { int Ich schätze = 16777217; schweben f_Value = 16777216.0; printf("Die Ganzzahl ist: %d\n", Ich schätze); printf("Der Schwimmer ist: %f\n", f_Value); printf("Ihre Gleichheit: %d\n", Ich schätze == f_Value); }
Bei Compilern, die Floats als IEEE-Einzelgenauigkeit und INTs als mindestens 32 Bit implementieren, gibt dieser Code diesen besonderen Ausdruck:
Die Ganzzahl ist: 16777217 Der Schwimmer ist: 16777216.000000 ihre Gleichheit: 1
Beachten Sie, dass 1 Gleichheit in der letzten Zeile oben darstellt. Dieses seltsame Verhalten wird durch eine implizite Umwandlung von verursacht i_value
zu schweben, wenn es verglichen wird mit f_value
. Die Umwandlung führt zu einem Präzisionsverlust, wodurch die Werte vor dem Vergleich gleich sind.
Wichtige Imbiss:
-
float
zuint
Ursachen Kürzung, d.h. -
double
zufloat
Ursachen Rundung der Ziffern. -
long
zuint
Ursachen, wenn überschüssige Bits höherer Ordnung fallen.
Geben Sie Promotion ein
Ein Sonderfall implizite Typkonvertierung ist die Typ -Promotion, bei der ein Objekt automatisch in einen anderen Datentyp umgewandelt wird, der a darstellt Superset des ursprünglichen Typs. Promotionen werden üblicherweise mit Typen verwendet, die kleiner sind als der native Typ der Zielplattform Arithmetik-Logikeinheit (ALU) vor arithmetischen und logischen Operationen, um solche Operationen möglich oder effizienter zu gestalten, wenn die ALU mit mehr als einem Typ arbeiten kann. C und C ++ führen eine solche Werbung für Objekte von Booleschen, Charakter, breitem Charakter, Aufzählung und kurzen Ganzzahl aus, die zu int gefördert werden, und für Objekte vom Typ Float, die zum Doppelförderung gefördert werden. Im Gegensatz zu einigen anderen Typkonvertierungen verlieren Promotionen niemals Präzision oder ändern den im Objekt gespeicherten Wert.
Im Java:
int x = 3; doppelt y = 3.5; System.aus.println(x + y); // Die Ausgabe beträgt 6,5
Explizite Typumwandlung
Explizite Typkonvertierung, auch Typ Casting genannt, ist eine Typumwandlung, die in einem Programm explizit definiert wird (anstatt automatisch gemäß den Regeln der Sprache für die implizite Typumwandlung durchgeführt zu werden). Es wird vom Benutzer im Programm definiert.
doppelt da = 3.3; doppelt db = 3.3; doppelt DC = 3.4; int Ergebnis = (int)da + (int)db + (int)DC; // result == 9 // Wenn eine implizite Konvertierung verwendet würde (wie bei "Ergebnis = da + db + dc"), wäre das Ergebnis gleich 10
Es gibt verschiedene Arten von explizitem Umbau.
- überprüft
- Bevor die Konvertierung durchgeführt wird, wird eine Laufzeitprüfung durchgeführt, um festzustellen, ob der Zieltyp den Quellwert halten kann. Wenn nicht, wird eine Fehlerbedingung angehoben.
- deaktiviert
- Es wird kein Scheck durchgeführt. Wenn der Zieltyp den Quellwert nicht enthalten kann, ist das Ergebnis undefiniert.
- Bitmuster
- Die Rohbitdarstellung der Quelle wird wörtlich kopiert und entsprechend dem Zieltyp neu interpretiert. Dies kann auch durch erreicht werden Aliasing.
Im Objekt orientierte Programmierung Sprachen können auch Objekte sein niedergeschlagen: Eine Referenz einer Basisklasse wird in eine seiner abgeleiteten Klassen gegossen.
C# und C ++
Im C#, Typumwandlung kann in einer sicheren oder unsicheren (d. H. C-ähnlichen) Weise durchgeführt werden, die erstere genannt wird GEWAHRT.[8]
Tier Tier = Neu Katze(); Bulldogge b = (Bulldogge) Tier; // if (Tier ist Bulldog), Stat.Type (Tier) ist Bulldog, sonst eine Ausnahme b = Tier wie Bulldogge; // if (Tier ist Bulldogge), b = (Bulldog) Tier, sonst b = null Tier = Null; b = Tier wie Bulldogge; // b == null
Im C ++ Ein ähnlicher Effekt kann mit Verwendung erreicht werden C ++-Style Castsyntax.
Tier* Tier = Neu Katze; Bulldogge* b = static_cast<Bulldogge*>(Tier); // kompiliert nur, wenn entweder Tier oder Bulldoggen vom anderen (oder gleichen) abgeleitet sind b = Dynamic_cast<Bulldogge*>(Tier); // if (Tier ist Bulldog), b = (Bulldog*) Tier, sonst b = nullptr Bulldogge& Br = static_cast<Bulldogge&>(*Tier); // Gleich wie oben, aber eine Ausnahme wird ausgelöst, wenn ein Nullptr zurückgegeben werden sollte // Dies ist nicht im Code zu sehen, bei dem die Ausnahmebehandlung vermieden wird Tier = nullptr; b = Dynamic_cast<Bulldogge*>(Tier); // b == nullptr löschen Tier; // Immer kostenlose Ressourcen
Eiffel
Im Eiffel Der Begriff der Typumwandlung wird in die Regeln des Typsystems integriert. Die Zuordnungsregel besagt, dass eine Zuordnung, wie z. B.:
x : = y
ist nur dann gültig, wenn der Typ seines Quellausdrucks, y
in diesem Fall ist kompatibel mit die Art seiner Zielentität, x
in diesem Fall. In dieser Regel, kompatibel mit bedeutet, dass der Typ des Quellausdrucks auch entspricht oder konvertiert zu das des Ziels. Die Konformität der Typen wird durch die vertrauten Regeln für definiert Polymorphismus in objektorientierter Programmierung. Zum Beispiel in der obigen Zuordnung der Typ von y
entspricht der Art von x
Wenn die Klasse, auf der y
ist basierend ein Nachkomme davon, auf dem x
ist basiert.
Definition der Typumwandlung im Eiffel
Die Aktionen der Typumwandlung in Eiffel speziell konvertiert zu und Konvertiten von werden definiert als:
Ein Typ basierend auf einer Klasse cu konvertiert zu ein Typ t basierend auf einer Klasse ct (und t Konvertiten von U) Wenn beides
- Ct hat a Konvertierungsverfahren Verwenden Sie u als Konvertierungstyp, oder
- Cu hat a Conversion -Abfrage Listing T als Konvertierungstyp
Beispiel
Eiffel ist eine vollständige Konformität Sprache Für Microsoft .NET Framework. Vor der Entwicklung von .NET hatte Eiffel bereits umfangreiche Klassenbibliotheken. Unter Verwendung der Bibliotheken vom Typ .NET, insbesondere bei häufig verwendeten Typen wie Zeichenfolgen, stellt ein Konvertierungsproblem auf. Bestehende Eiffeltoftware verwendet die String -Klassen (wie z. STRING_8
) aus den Eiffeltibliotheken, aber für .NET geschriebene Eiffeltoftware muss die .NET String -Klasse verwenden (System.String
) In vielen Fällen beispielsweise beim Aufrufen von .NET -Methoden, die erwarten, dass Elemente des .NET -Typs als Argumente übergeben werden. Die Umwandlung dieser Typen hin und her muss also so nahtlos wie möglich sein.
my_string: String_8 - Native Eiffeltazifa my_system_string: System_String - Native .NET-Zeichenfolge ... my_string : = my_system_string
Im obigen Code werden zwei Zeichenfolgen deklariert, einer von jedem verschiedenen Typ (SYSTEM_STRING
ist der Eiffelt -konforme Alias für System.String). Da System.String
entspricht nicht an STRING_8
dann ist die obige Zuordnung nur gültig, wenn System.String
konvertiert zu STRING_8
.
Die Eiffeltellklasse STRING_8
hat ein Konvertierungsverfahren make_from_cil
Für Objekte vom Typ System.String
. Konvertierungsverfahren werden auch immer als Erstellungsverfahren bezeichnet (ähnlich wie Konstruktoren). Das Folgende ist ein Auszug aus dem STRING_8
Klasse:
Klasse String_8 ... schaffen make_from_cil ... Konvertieren make_from_cil ({{System_String}) ...
Das Vorhandensein des Konvertierungsverfahrens macht die Zuordnung:
my_string : = my_system_string
Semantisch äquivalent zu:
schaffen my_string.make_from_cil (my_system_string)
in welchem my_string
wird als neues Objekt vom Typ konstruiert STRING_8
mit Inhalt entspricht dem von my_system_string
.
Um eine Zuordnung mit ursprünglicher Quelle und Ziel umgekehrt zu behandeln:
my_system_string : = my_string
die Klasse STRING_8
Enthält auch eine Conversion -Abfrage to_cil
die a produzieren a System.String
aus einer Instanz von STRING_8
.
Klasse String_8 ... schaffen make_from_cil ... Konvertieren make_from_cil ({{System_String}) to_cil: {System_String} ...
Die Zuordnung:
my_system_string : = my_string
Dann wird::
my_system_string : = my_string.to_cil
In Eiffel ist das Setup für die Typkonvertierung im Klassencode enthalten, scheint jedoch so automatisch wie automatisch zu passieren explizite Typumwandlung im Client -Code. Das enthält nicht nur Zuweisungen, sondern auch andere Arten von Anhängen, wie z. B. Argument (Parameter).
Rost
Rost Bietet keine implizite Typumwandlung (Zwang) zwischen primitiven Typen. Es kann jedoch mit dem expliziten Typkonvertierung (Casting) durchgeführt werden wie
Stichwort.[9]
println!("1000 als U16 ist: {}", 1000 wie U16);
Sicherheitsprobleme
Im HackingTypecasting ist der Missbrauch der Typumwandlung, um vorübergehend a zu ändern a VariableDer Datentyp aus der Art und Weise, wie es ursprünglich definiert wurde.[10] Dies bietet Hackern Möglichkeiten, da bei der Typ -Konvertierung nach einer Variablen "typecast" ein anderer Datentyp wird. Der Compiler behandelt diese gehackte Variable als neuer Datentyp für diesen spezifischen Vorgang.[11]
Siehe auch
Verweise
- ^ a b c Mehrotra, Dheeraj (2008). S. Chands Informatik. S. 81–83. ISBN 978-8121929844.
- ^ Programmiersprachen - Design und Konstrukte. 2013. p. 35. ISBN 978-9381159415.
- ^ a b Reilly, Edwin (2004). Präzise Enzyklopädie der Informatik. pp.82, 110. ISBN 0470090952.
- ^ Fenton, Steve (2017). Pro TypeScript: JavaScript-Entwicklung im Anwendungsmaßstab. S. xxiii. ISBN 978-1484232491.
- ^ "PHP: Typ Jonglieren - Handbuch". php.net. Abgerufen 27. Januar 2019.
- ^ a b Olsson, Mikael (2013). C ++ Quick Syntax Referenz. S. 87–89. ISBN 978-1430262770.
- ^ Kruse, Rudolf; Borgelt, Christian; Braune, Christus; Mostaghim, Sanaz; Steinbrecher, Matthias (16. September 2016). Computational Intelligence: Eine methodische Einführung. p. 269. ISBN 978-1447172963.
- ^ Mössenböck, Hanspeter (25. März 2002). "Advanced C#: Checked Type Casts" (PDF). Institut Für Systemoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. p. 5. Abgerufen 4. August 2011. bei C# Tutorial
- ^ "Casting - Rost für Beispiel". doc.rustlang.org.
- ^ Jon Erickson Hacking, 2. Ausgabe: Die Kunst der Ausbeutung 2008 1593271441 P51 "Die TypeCasting ist einfach eine Möglichkeit, den Datentyp einer Variablen vorübergehend zu ändern, obwohl er ursprünglich definiert wurde. Wenn eine Variable in einen anderen Typ typisiert wird Geben Sie jedoch nur für diesen Vorgang an. Die Syntax für die Typenanschlüsse lautet wie folgt: (typecast_data_type) Variable ... "
- ^ Arpita Gopal Vergrößerung c 2009 81203338618 p. 59 "Aus dem obigen ist klar, dass die Verwendung von Typen eine Variable eines Typs erstellt, wie ein anderer Typ für einen einzelnen Operation. Mit dieser Fähigkeit der Typenanschlüsse ist es möglich, ASCII -Zeichen zu erstellen, indem sie die Typecasting Integer to -Typeger -Typen erstellen können. es ist ..."
Externe Links
- Casting in Ada
- Casting in C ++
- C ++ Referenzhandbuch Warum ich C ++ Cast -Operatoren von Danny Kalev hasse
- Casting in Java
- Implizite Conversions in C#
- Implizite Typ Casting bei cppreference.com
- Statische und neu interpretierende Gussteile in C ++
- Aufstieg und Downcasting in F#