35 votes

Quel est le comportement lors de la conversion d'une valeur à virgule flottante négative en un entier non signé?

Que se passe-t-il si une valeur en virgule flottante négative est convertie en une valeur de type intégral non signé? Des citations standard seraient appréciées. Le problème auquel je suis confronté est la conversion en valeurs de types intégraux non signés à partir d'une classe variant, qui contient un objet de type à virgule flottante.

EXEMPLE:

 unsigned i = -.1;
 

40voto

Lundin Points 21616

Dans le cas où la valeur négative est -1.0 ou plus bas, il invoque un comportement indéfini depuis la partie intégrale ne peut pas être représenté par un nombre non signé. Sinon, (comme dans le cas de -0.1), si elle peut être représentée par un type entier, il est bien définie comportement. Voir le C11 norme ISO 9899:2011:

6.3.1.4

Lorsqu'une valeur finie de réel flottant type est converti en un entier type autre que _Bool, la partie fractionnaire est jeté (c'est à dire, le la valeur est tronquée vers zéro). Si la valeur de l'intégrale de la partie ne peuvent pas être représentés par le type entier, le comportement est indéfini. 61)

Et puis il y a un non-normative de pied note expliquant le texte ci-dessus:

61) Le remaindering opération effectuée lorsqu'une valeur de type integer est converti en unsigned type n'a pas besoin d'être effectuée lorsqu'une valeur de réel flottant type est converti en type non signé. Ainsi, la gamme de portable réel les valeurs flottantes est (-1, Utype_MAX+1).

ISO/IEC 9899:1999 (C99) contient exactement le même texte.

28voto

atturri Points 975

C'est un comportement indéterminé en C99 si le nombre à virgule flottante est inférieure ou égale à -1.0. Si c'est dans la gamme (-1.0, 0.0), la valeur sera 0.

De C99, §6.3.1.4, paragraphe 1

Lorsqu'une valeur finie de réel flottant type est converti en un entier de type autre que _Bool, la partie fractionnaire est jeté (c'est à dire, la valeur est tronquée vers zéro). Si la valeur de l'intégrale de la partie ne peut pas être représenté par le type entier, le comportement est indéfini

Note de bas de page 50 précise le comportement de l' (-1.0, 0.0) gamme.

5voto

sun qingyao Points 1584

Votre exemple, unsigned i = -.1; est bien défini par les deux C11 et C99, et le résultat est i == 0.

Cité de N1570, 6.3.1.4 Réel flottant et entier:

  1. Lorsqu'une valeur finie de réel flottant type est converti en un entier de type autre que _Bool, la partie fractionnaire est jeté (c'est à dire, la valeur est tronquée vers zéro). Si la valeur de l'intégrale de la partie ne peuvent pas être représentés par le type entier, le comportement est undefined.61)

61) Le remaindering opération effectuée lorsqu'une valeur de nombre entier type est converti en unsigned type n'a pas besoin d'être effectuée lorsqu'une valeur de réel flottant type est converti en type non signé. Ainsi, la gamme de portable réel les valeurs flottantes est (-1, Utype_MAX+1).

Cité de N869, 6.3.1.4 Réel flottant et entier:

#1

Lorsqu'une valeur finie de réel flottant type est converti en un entier type autre que _Bool, la partie fractionnaire est jeté (c'est à dire, le la valeur est tronquée vers zéro). Si la valeur de l'intégrale de la partie ne peuvent pas être représentés par le type entier, le comportement est undefined.43)

43)Le remaindering opération effectuée lorsqu'une valeur de nombre entier type est converti en unsigned type n'a pas besoin d'être effectuée lorsqu'une valeur de réel flottant type est converti en type non signé. Ainsi, la gamme de portable réel les valeurs flottantes est (-1, Utype_MAX+1).

Cependant, comme vous pouvez le voir dans les citations, en essayant de convertir les constantes en virgule flottante en dehors de l'intervalle (-1, Utype_MAX+1) invoque un comportement indéterminé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X