2010-11-23 7 views
2

Parfois, je dois convertir d'une valeur entière non signée en float. Par exemple, mon moteur graphique prend un SetScale(float x, float y, float z) avec des flottants et j'ai un objet qui a une certaine taille comme unsigned int. Je veux convertir le non signé int en un flotteur pour mettre à l'échelle correctement une entité (l'exemple est très spécifique mais j'espère que vous obtenez le point).Int ou Unsigned Int pour flotter sans avoir d'avertissement

Maintenant, ce que je fais habituellement est:

unsigned int size = 5; 
float scale = float(size); 
My3DObject->SetScale(scale , scale , scale); 

Est-ce une bonne pratique du tout, sous certaines hypothèses (voir les notes)? Y at-il un meilleur moyen que de jeter le code avec float()?

Notes: Je ne peux pas toucher l'API graphique. Je dois utiliser la fonction SetScale() qui prend en charge les flottants. De plus, je ne peux pas non plus toucher à la taille, ça doit être un int non signé. Je suis sûr qu'il y a beaucoup d'autres exemples avec le même «problème». Ce qui précède peut être appliqué à toute conversion qui doit être faite et vous en tant que programmeur avez peu de choix en la matière.

Répondre

9

Il existe une conversion implicite de unsigned int à float, de sorte que la conversion est strictement inutile.

Si votre compilateur émet un avertissement, il n'y a rien de mal à utiliser un transtypage pour faire taire l'avertissement. Sachez simplement que si size est très grand, il peut ne pas être représentable exactement par un float.

+0

Cela va barf avertissements comme un 18 ans à un bizutage sur mon compilateur aux réglages les plus élevés. –

+0

Oui, MS VC++ 10 prévient pour cela. Supprimé ma réponse car la distribution est nécessaire pour se débarrasser de ceux-ci. –

+0

En laissant le casting, je veux dire –

9

Ma préférence serait d'utiliser static_cast:

float scale = static_cast<float>(size); 

mais ce que vous faites est fonctionnellement équivalent et bien.