2010-11-22 50 views
1

Est-ce sécuritaire: Pour être encore plus préciscoulée entre signé et non signé

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

: 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 récupérer ces données de cette manière?

Merci!

+0

Veuillez formater votre code en utilisant le bouton '101010' situé en haut du volet d'édition. Et non, le style C n'est jamais sûr. Je peux le dire sans même regarder ce que fait cette distribution. – sbi

+1

@sbi, une distribution signée non signée (par exemple) avec la même largeur est sûre et complètement définie, quelle que soit la syntaxe utilisée. –

+1

Je suis d'accord, en utilisant un modèle de refonte avec des types primitifs me semble être une exagération ridicule. – teukkam

Répondre

4

Non, je crois que c'est une implémentation définie. A partir du C++ projet de norme, §4.7/3

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

Cela s'applique à la première instruction. int16_t est signé, et il ne peut pas représenter 50000. Donc la valeur de t1 dépend de l'implémentation.

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

1

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

Les types existent aussi pour la communication, pas seulement pour le processus de compilation.

0

L'affectation d'un nombre qui ne peut pas être représenté dans un type signé est définie par l'implémentation. La conversion suivante a cependant un comportement standard défini. Ainsi, le résultat de la fonction est la mise en œuvre définie, si cela est sûr ou non, est une question subjective. Mais portable sur les plates-formes ou les compilateurs ce n'est pas le cas.