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:
- 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é.