2010-09-04 6 views
4

Je n'arrive pas à comprendre certaines syntaxes de typage. Par exemple.Type de coulée, problème de langage c

float f=7.0; 
short s=*(short *)&f; 

Que se passe-t-il ici short s=*(short *)&f? On dirait que nous cast something comme un pointeur vers un court et puis l'initialisation s à la valeur stockée dans l'adresse pointée par something.

Maintenant, ce something ressemble à l'adresse de la variable f. Donc, si something = address of f, il me semble que nous faisons address of f comme un pointeur vers un court, puis la dé-référençant. Je sais que ce que j'ai dit est faux, mais je n'arrive pas à le visualiser.

Merci.

+0

Quelqu'un répondu à cette question, mais pour une raison quelconque supprimé. Un point qu'il a déclaré était que '& f' est un pointeur vers un flotteur. Je suppose que le problème auquel je faisais face est que je visualiserais '& f' comme une valeur, c'est-à-dire une adresse et non comme une variable/pointeur. Donc, ce qui se passe ici, c'est qu'un 'pointeur sur float' est lancé comme un 'pointeur vers court', n'est-ce pas? –

+1

@ naruto-uzumaki Oui, la distribution dans votre exemple est une conversion de pointeur de "pointeur à flotteur" à "pointeur à court". –

+0

Merci! C'est génial d'apprendre quelque chose de nouveau chaque fois que je poste à stackoverflow :) –

Répondre

5

Cette syntaxe aurait le plus de sens si short avait la même taille que float et même ainsi, il resterait un problème avec "strict aliasing rules".

Il est utilisé pour interpréter les bits du float f comme représentant un nombre entier. Il est utilisé pour contourner le fait que s = (short) f; serait interprété comme conversion en nombre entier. Troncature, je crois.

2

Votre interprétation est correcte. Il oblige essentiellement le compilateur à traiter la mémoire en stockant f comme si elle traitait réellement un short. Le résultat de ceci dépendra de la plateforme. Ceci est très différent de short s = (short)f;, qui effectuera une belle conversion, et est bien défini.

1

1. Chaque fois que vous tapez cast quelque chose, il doit à l'intérieur des crochets(). 2. L'intérieur des types primitifs n'est pas une gamme plus élevée (taille) que d'autres types primitifs (à l'extérieur des parenthèses). 3. Après le lancement de la variable, elle sera stockée dans le même type primitif que vous souhaitez convertir. 4.Pointer signifie qu'il stocke la mémoire de address.it indiquera l'étoile c (*)

0

Il devraient être:.

float f=7.0; 
short s=*(short)&f; 

-à-dire court est attribué une valeur 7