Question

Est-ce sûr:

int main()
{
    boost::int16_t t1 = 50000; // overflow here.
    boost::uint16_t t2 = (boost::uint16_t)t1;
    std::cout << t1 << " "  << t2 <<  std::endl;
}

Pour être encore plus précis: je stocker ces données dans une table qui utilise les types signés dans son schéma, est-il sûr de stocker et de récupérer ces données de cette manière

Merci!

Était-ce utile?

La solution

Non, je crois que cela est défini par l'implémentation. De la norme C projet de, §4.7 / 3

  

Si le type de destination est signé, le   la valeur est inchangée si elle peut être   représenté dans le type de destination   (Et bit- fi eld largeur); sinon, le   la valeur est mise en œuvre dé fi nie.

Il en est à la première instruction. int16_t est signé, et il ne peut pas représenter 50000. Ainsi, la valeur de t1 dépend de la mise en œuvre.

Une fois que vous savez t1, t2 est garantie par §4.7 / 2 pour être le plus bas congruent uint16_t module 2 ^ 16 à t1. Fondamentalement, t1 mod 2 ^ 16.

Autres conseils

Je dirais qu'il est sûr, mais pourquoi ne pas utiliser un uint16_t sans passer par ce casting trompeur?

Types existe pour la communication aussi, non seulement pour le bien du processus de compilation.

L'attribution d'un numéro qui ne peut pas être représenté dans un type signé est défini par l'implémentation. La conversion suivante a cependant un comportement standard défini. Ainsi, le résultat de la fonction est mise en œuvre définie, si c'est sûr ou non, est une question subjective. Mais portable sur toutes les plateformes ou les compilateurs il n'est pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top