2010-02-11 3 views

Répondre

9

Dans ce cas, le static_cast<> est une conversion de type explicite. la norme a ceci à dire au sujet des conversions intégrales en 4.7/3 « conversions intégrales »:

Si le type de destination est signé, la valeur est inchangée si elle peut être représentée dans le type de destination (et la largeur du champ de bit) sinon, la valeur est définie par l'implémentation.

Depuis short est garanti d'être en mesure de maintenir la valeur 200 (short doit être d'au moins 16 bits), puis pour votre exemple précis, la réponse est oui.

Plusieurs compilateurs adhèrent très bien à ce comportement - c'est ainsi depuis les jours pré-ANSI de C, et tellement de code dépend du comportement que les fournisseurs de compilateurs semblent hésiter à émettre des avertissements sur la possibilité de troncature.

-2

Si la valeur est comprise entre short, la valeur est correcte, ce qui dans votre cas est vrai, donc y == 200.

Si elle est en dehors (par exemple, static_cast<short>(1000000000)), le comportement est indéfini. La plupart des compilateurs tronqueront simplement les chiffres binaires à la taille correcte.

+0

Comportement non défini, non spécifié. – GManNickG

+4

@GMan: non spécifié, mais défini par l'implémentation. Il existe une différence subtile: pour la mise en œuvre définie, il existe un comportement spécifique que l'implémentation doit documenter, ce qui n'est pas nécessaire pour un comportement non spécifié. La différence entre un comportement «non spécifié» et un comportement «non défini» est qu'il existe généralement un ensemble de comportements autorisés pour non spécifié, alors que pour tout ce qui ne l'est pas, tout se passe (y compris l'écrasement). –

+0

@Michael: Bon à savoir, merci. – GManNickG

Questions connexes