2010-07-09 27 views
0

Lorsqu'un flottant est converti en int, comment ce transtypage est implémenté par le compilateur. Est-ce que le compilateur masque une partie de la mémoire de la variable float, c'est-à-dire quelle partie de la mémoire est pliée par le compilateur pour passer la variable restante à int.Essayer de comprendre comment le transtypage/conversion est effectué par le compilateur, par exemple, lorsqu'il est transtypé de float à int

Je suppose que la réponse à cette question réside dans la façon dont int et float est maintenu en mémoire.

Mais n'est-ce pas dépendant de la machine plutôt que dépendant du compilateur. Comment compilateur décide quelle partie de la mémoire à copier lorsqu'il est casted à un type inférieur (c'est un casting statique, à droite). Je suis un peu confus avec une mauvaise information, je suppose. (J'ai lu quelques questions sur tag = downcasting, où le débat sur si c'était un cast ou une conversion se passait, je ne suis pas très intéressé par ce que l'on appelle, car les deux sont effectués par le compilateur, mais sur comment cela est effectué).

... Merci

+0

De quel langage de programmation parlez-vous? – adamk

+0

vous pouvez prendre C++, mais fait-il n'importe quel diff avec le comportement si c ou C++. (si vous ne vouliez pas dire autre lang, autre que c/C++) – saurabh

Répondre

0

Quand on parle de types de base et non comme des pointeurs, puis une conversion est faite. Étant donné que les représentations en virgule flottante et en nombre entier sont très différentes (généralement IEEE-754 et le complément à deux, respectivement), il ne s'agit pas seulement de masquer certains bits.

Si vous vouliez voir le nombre de virgule flottante représenté comme un entier sans faire une conversion, vous pouvez faire quelque chose comme ça (en C):

float f = 10.5; 
int i2 = (int*)&f; 
printf("%f %d\n", f, i2); 
+0

L'expression '* (int *) & f' a des résultats indéfinis car elle enfreint les règles d'aliasing de pointeur de C. Sur les versions récentes de gcc ne fonctionnera souvent pas correctement. Consultez cet article pour une bonne explication de l'aliasing et des manières correctes de faire ce que vous essayez (les contenus ne sont généralement pas spécifiques à Cell, bien que ce soit sur un site orienté Cell): http://cellperformance.beyond3d.com/articles/ 2006/06/understanding-strict-aliasing.html –

+0

Bon point. Utiliser une union (en C/C++ de toute façon) est probablement la bonne réponse pour réinterpréter des bits. Mais c'est une sorte de chose inutile à faire de toute façon, alors la question que j'espère est purement académique! Mais à la question d'origine, il s'agit vraiment d'une conversion (modification des schémas de bits) qui se produit lorsque l'on parle d'ints et de floats. –

+0

Oui, comme indiqué dans la question elle-même, c'est à des fins de compréhension seulement. De toute façon, votre réponse a aidé. Merci – saurabh

0

La plupart des architectures CPU fournissent une instruction native (ou multi -instruction sequence) à faire flotter < -> conversions int. Le compilateur générera généralement cette instruction. Il y a souvent des méthodes plus rapides. Cette question a de bonnes informations: What is the fastest way to convert float to int on x86.