Nun, beachten Sie zunächst, dass eine Besetzung eine explizite Anfrage ist, einen Wert eines Typs in einen Wert eines anderen Typs zu konvertieren. Ein Cast erzeugt auch immer ein neues Objekt, das vom Cast-Operator als temporäres Objekt zurückgegeben wird. Durch das Umwandeln in einen Referenztyp wird jedoch kein neues Objekt erstellt. Das Objekt, auf das der Wert verweist, wird als Referenz eines anderen Typs neu interpretiert.
Nun zu Ihrer Frage. Beachten Sie, dass es zwei Haupttypen von Umwandlungen:
- Promotions: Diese Art gedacht werden kann von einem möglicherweise schmalen Typ einer breiteren Art von Gießen. Casting von Char zu Int, Short zu Int, Float zu Double sind alle Promotions.
- Konvertierungen: Diese ermöglichen das Umwandeln von long in int, int in unsigned int und so weiter. Sie können grundsätzlich Informationsverlust verursachen. Es gibt Regeln dafür, was passiert, wenn Sie beispielsweise einem vorzeichenlosen typisierten Objekt eine
-1
zuweisen. In einigen Fällen kann eine falsche Konvertierung zu einem nicht definierten Verhalten führen. Wenn Sie ein Double zuweisen, das größer ist als das, was ein Float in einem Float speichern kann, ist das Verhalten nicht definiert.
Schauen wir uns Ihre Abgüsse:
int i = 10;
unsigned int k = (unsigned int) i; // :1
float fl = 10.123;
unsigned int ufl = (unsigned int) fl; // :2
char *p = "Stackoverflow Rocks";
unsigned char *up = (unsigned char *) p; // :3
- Diese Umwandlung eine Umwandlung zu geschehen verursacht. Es passiert kein Datenverlust, da 10 garantiert von einer
unsigned int
gespeichert wird. Wenn die ganze Zahl negativ wäre, würde der Wert im Grunde den maximalen Wert eines unsigned int umhüllen (siehe 4.7/2).
- Der Wert
10.123
ist auf 10 abgeschnitten. Hier ist es tut Ursache von Informationen verloren, offensichtlich. Wenn 10 in ein vorzeichenloses int passt, wird das Verhalten definiert.
- Dies erfordert tatsächlich mehr Aufmerksamkeit. Erstens gibt es eine veraltete Konvertierung von einem Zeichenfolgenliteral in
char*
. Aber lass uns das hier ignorieren. (siehe here). Noch wichtiger: Was passiert, wenn Sie auf einen unsignierten Typ umwandeln? Tatsächlich ist das Ergebnis davon nicht spezifiziert per 5.2.10/7 (beachte, dass die Semantik dieser Umwandlung dieselbe ist wie die Verwendung von reinterpret_cast in diesem Fall, da dies die einzige C++ - Umwandlung ist, die dies kann):
Ein Zeiger auf ein Objekt kann explizit in einen Zeiger auf ein Objekt anderen Typs konvertiert werden. Außer dass ein rvalue vom Typ "Zeiger auf T1" in den Typ "Zeiger auf T2" konvertiert wird (wobei T1 und T2 Objekttypen sind und die Ausrichtungsanforderungen von T2 nicht strenger sind als die von T1) und zurück zu seinem ursprünglichen Typ ergibt der ursprüngliche Zeigerwert, das Ergebnis einer solchen Zeigerumwandlung ist nicht spezifiziert.
So können Sie den Zeiger nur verwenden, nachdem Sie erneut auf char *
zurückgeworfen haben.
Hinweis: Dies gilt nur in C++ nicht in C. – Stargateur