Lors du codage dans des langages de bas niveau comme CI, trouver que la conversion signifie parfois `` réinterpréter ces octets comme s'il avait toujours été de cet autre type '' et à d'autres moments comme `` convertir cette valeur intelligemment en cet autre type ''.
Quelle est la signification originale du mot et y a-t-il une cohérence dans le moment de s'attendre à une conversion et le moment de s'attendre à une réinterprétation brute?
terminology
type-casting
Alexander Torstling
la source
la source
cast
au sens informatique est plus similaire à la coulée au sens métallurgique, où la forme d'un métal fondu est reformée lorsqu'il est coulé dans un moule: britannica.com/EBchecked/topic/377665/metallurgy/81884/CastingRéponses:
La diffusion en C est unique, contrairement à d'autres langages. Il n'est également jamais intelligent.
La conversion en C convertit les valeurs d'un type à un autre à l'aide de règles soigneusement définies. Si vous avez vraiment besoin de savoir, lisez la norme. Sinon, les points principaux sont:
Certains transtypages sont appliqués implicitement, et dans certains d'entre eux, le compilateur émet un avertissement. Mieux vaut tenir compte des avertissements!
Il est préférable d'ignorer la définition du dictionnaire pour la distribution, car elle n'est pas utile. De nombreux modèles sont mieux décrits par les termes conversion ou coercition, il vaut donc la peine de les connaître également.
C ++ est BEAUCOUP plus compliqué, mais vous ne l'avez pas demandé, n'est-ce pas?
la source
T*
versvoid*
et retour est toujours bien définie.Cette partie du dictionnaire Webster donne la bonne définition:
Ainsi, avant de lancer, votre "objet" (pas littéralement un objet OOP) est dans une forme (type) donnée. Lorsque vous le refondez, c'est "couler du béton" autour pour lui donner une nouvelle forme, c'est ce que vous faites avec la coulée. Vous avez un nombre sous forme d'entier hexagonal, et après la coulée, vous obtiendrez une chaîne en forme de rectangle.
la source
Il peut être utile de séparer les transtypages C en deux groupes:
Moulages numériques - convertissez un nombre entre une représentation en une autre, en essayant de conserver la valeur. Par exemple -
(int)3.1
serait3
. Il existe des règles précises définissant ce qui se passe lorsque la valeur exacte ne peut pas être conservée.Casting du pointeur - Conservez l'adresse mémoire, mais changez la façon dont elle est déréférencée. Par exemple, pour
float x=3.5
,*(int *)&x
donnera1080033280
- cet entier est représenté par le même motif binaire qui représente le flottant3.5
.la source
Keep the memory address, but change the way it's dereferenced.
Le déréférencement d'un pointeur avec punition de type n'est pas défini. La norme garantit uniquement que la coulée de etA *
vers l'B *
arrière produira la même choseA *
, qui peut ne pas avoir été valable pour déréférencer en premier lieu - ou que siB *
c'est unchar *
, elle peut être utilisée pour lire la représentation d'objet de tout type. Pour tous les autres types, leB *
pointeur de déréférencement est punitif, UB et viole l'aliasing strict. Quoi qu'il en soit, même si le compilateur n'a pas mis à la poubelle l'exemple 2 ci-dessus pour cette raison, vous faites des hypothèses non transférables sur les modèles de bitsEn C ++, les différents types de transtypages peuvent être rendus plus explicites, ce qui
reinterpret_cast
signifie "traiter ces octets comme s'ils étaient déjà cette autre chose". En C, vous pouvez le rendre absolument explicite en utilisant ununion
, le casting avec l'(type)
opérateur tentera de garder le résultat numériquement équivalent, jusqu'à perte de précision.la source
int*
mot qui soit un mot etchar*
deux mots [avec le deuxième octet sélectionnant l'octet haut ou bas d'un mot]. La conversion d'un(int*)
to(char*)
nécessiterait l'ajout d'un mot supplémentaire qui devrait être la valeur qui spécifierait le premier octet duint
.