Wenn Sie in einfachen Sprachen wie CI codieren, bedeutet Casting manchmal "interpretieren Sie diese Bytes neu, als ob es immer von einem anderen Typ gewesen wäre" und zu anderen Zeiten "konvertieren Sie diesen Wert intelligent in diesen anderen Typ".
Was ist die ursprüngliche Bedeutung des Wortes und gibt es eine Übereinstimmung, wann mit einer Konvertierung und wann mit einer rohen Neuinterpretation zu rechnen ist?
terminology
type-casting
Alexander Torstling
quelle
quelle
cast
im Computerbereich ähnelt eher dem Begriff Gießen im metallurgischen Bereich, bei dem sich die Form einer Metallschmelze beim Eingießen in eine Form ändertAntworten:
Casting in C ist einzigartig, im Gegensatz zu anderen Sprachen. Es ist auch niemals intelligent.
Das Casting in C konvertiert Werte von einem Typ in einen anderen unter Verwendung sorgfältig definierter Regeln. Wenn Sie es wirklich wissen müssen, lesen Sie die Norm. Ansonsten sind die wichtigsten Punkte:
Einige Casts werden implizit angewendet, und in einigen Fällen gibt der Compiler eine Warnung aus. Am besten die Warnungen beachten!
Die Wörterbuchdefinition für cast wird am besten ignoriert, da sie nicht hilfreich ist. Viele Casts lassen sich besser mit den Begriffen Bekehrung oder Zwang beschreiben, daher lohnt es sich, auch diese zu kennen.
C ++ ist VIEL komplizierter, aber das haben Sie nicht gefragt, oder?
quelle
T*
nachvoid*
und zurück immer genau definiert ist.Dieser Teil des Webster-Wörterbuchs enthält die richtige Definition:
Vor dem Casting hat Ihr "Objekt" (nicht wörtlich ein OOP-Objekt) eine bestimmte Form (Typ). Wenn Sie es neu gießen, bedeutet dies, dass Sie es mit Beton umgießen, um eine neue Form zu erhalten. Sie haben eine Zahl als hexagonale Ganzzahl und nach dem Wirken erhalten Sie eine rechteckige Zeichenfolge.
quelle
Es kann nützlich sein, C-Casts in zwei Gruppen zu unterteilen:
Numerische Casts - Konvertieren Sie eine Zahl zwischen Darstellungen und versuchen Sie, den Wert beizubehalten. Zum Beispiel -
(int)3.1
wäre3
. Es gibt genaue Regeln, die definieren, was passiert, wenn der genaue Wert nicht eingehalten werden kann.Zeigerumwandlungen - Behalten Sie die Speicheradresse bei, ändern Sie jedoch die Art und Weise, in der sie dereferenziert wird. Zum Beispiel wird für
float x=3.5
,*(int *)&x
geben1080033280
- diese Ganzzahl wird durch dasselbe Bitmuster dargestellt, das den Gleitkommawert darstellt3.5
.quelle
Keep the memory address, but change the way it's dereferenced.
Die Dereferenzierung eines typgesteuerten Zeigers ist nicht definiert. Die Norm nur garantiert Gießen ausA *
zuB *
und Rückseite das gleiche produzierenA *
, die gültig sind möglicherweise nicht in dem 1. Platz zu dereferenzieren gewesen - oder dass , wennB *
eine istchar *
, kann es verwendet werden , um die Objektdarstellung von jeder Art zu lesen. Bei allen anderen Typen ist der Dereferenzierungszeiger einB *
Typ-Punning-Zeiger (UB) und verstößt gegen striktes Aliasing. Wie auch immer, selbst wenn der Compiler das obige Beispiel 2 aus diesem Grund nicht verworfen hat, machen Sie unportable Annahmen über BitmusterIn C ++ können die verschiedenen Arten von Umwandlungen expliziter gestaltet werden, mit der
reinterpret_cast
Bedeutung "Behandle diese Bytes so, als wären sie bereits diese andere Sache". In C können Sie dies durch die Verwendung von a absolut explizit machen. Durch dasunion
Casting mit dem(type)
Operator wird versucht, das Ergebnis numerisch äquivalent zu halten, bis es an Präzision verliert.quelle
int*
ein Wort und ein Wort mitchar*
zwei Wörtern hat (wobei das zweite Byte das hohe oder niedrige Byte eines Wortes auswählt). Das Umsetzen eines(int*)
to(char*)
würde das Hinzufügen eines zusätzlichen Wortes erfordern, das den Wert haben sollte, der das erste Byte desint
.