Bonjour,
Je ne comprend pas le comportement des lignes suivantes
J'obtient -1234Code:
1
2
3 int a=-1234; printf("%d",(unsigned int)a);
Je m'attendais à un nombre positif, il y a quelque chose qui m'échappe là!
Version imprimable
Bonjour,
Je ne comprend pas le comportement des lignes suivantes
J'obtient -1234Code:
1
2
3 int a=-1234; printf("%d",(unsigned int)a);
Je m'attendais à un nombre positif, il y a quelque chose qui m'échappe là!
Bonjour,
Oui, le fait que %d considère que ta variable est un entier signé.
Pour le non signé, c'est %u:
Remarque: printf est une fonction du C, pense à utiliser std::cout du C++, de même pour le cast:Code:printf("%u",a);
Code:std::cout<<static_cast<unsigned int>(a);
Salut,
La conversion (unsigned int)a ne change pas la valeur de a mais demande à l'interpréter comme un unsigned int. Sauf que la valeur, transmise à la fonction printf est interprétée par cette dernière comme un int, ce que dit %d.
Bref cette conversion ne sert à rien.
Ok merci pour vos remarques, mais en definitif comment dois-je m'y prendre alors pour que cela fonctionne. abs(a) ?
D'un point de vue plus général, je me demande aussi en à quoi sert le transtypage ?
Ben Winjerome t'a donné la réponse.
Salut,
De manière générale:
Le fait que tu utilise %d et non %u pour ton printf va forcément déjà intervenir sur la valeur que tu obtiendras à l'affichage, et c'est donc un problème "à part".
Pour le reste, seul le contexte dans lequel le code apparait pourra te donner une raison quant au transtypage, et sans doute t'éclairer sur les risques éventuels qu'il peut y avoir à l'effectuer.
Dans certains cas, tu sera tenté d'effectuer un transtypage "uniquement" pour éviter les avertissements de la part du compilateur (si tu essaye de comparer une valeur avec la valeur obtenue par la fonction size() d'une collection de la STL, par exemple)
Dans d'autres cas, ton souhait est, simplement, de "forcer" ta valeur à être dans une plage donnée (si tu veux afficher une adresse mémoire, par exemple, tu peux préférer l'afficher sous une forme non signée, pour n'avoir que des adresses supérieures à 0)
Le tout sans compter l'ensemble des raisons qui font que, à un moment donné, tu puisses préférer avoir affaire à un entier non signé :D
Mais il faut être conscient que, à moins d'avoir de très bonnes raisons de le faire, le transtypage reste toujours une "pratique à risques", surtout si tu l'effectue "à la hussarde", à la mode C :
En effet, tant que tu essayeras de convertir des types présentant des plages de valeurs similaires ou compatibles (char avec unsigned char ou plus gros, int avec unsigned int ou plus gros, ...), tu pourras envisager de travailler "plus ou moins sereinement", mais, si d'aventure tu en viens à essayer de transtyper un type "trop gros" pour le type de destination (ex : un long long en unsigned int), tu te prépare une foule de problème, "simplement" parce que la valeur résultante est très facilement susceptible d'avoir... perdu des données par rapport à la valeur d'origine!
Salut,
Tu sembles confondre le transtypage et retours de fonction.
Ceci :dit seulement au PC : les 4 octets de b contiennent la même valeurs binaire que les 4 octets de a, mais il faut traiter b comme un entier non signéCode:
1
2 int a = -1234; // a = 0xfffffb2e unsigned int b = static_cast<unsigned int> ( a ); // b = 0xfffffb2e
Et celà :fait que b contient la valeur absolue de a qui est le retour de la fonction abs et qui est une valeur positive. Ici la valeur binaire qui est dans les 4 octets de b est différente de celle de a. De plus, le retours de abs étant un int, le compilateur effectue une conversion implicite de int vers unsigned int pour affecter cette valeur à bCode:
1
2 int a = -1234; // a = 0xfffffb2e unsigned int b = abs ( a ); // b = 0x000004d2
Non, je ne confond pas retour de fonction et transtypage. Mon objectif initial était simplement d'etre certain d'avoir une variable positive.
En fait intialement j'ai un long64 issue d'un timer que je devais mettre dans une variable de type int. Pas de soucis tant que la variable initiale est inférieur à 2e31, mais au dela j'obtient un nombre <0 (normal). La valeur en soit n'ayant pas dimportance (c'est la graine d'un random) j'avais donc effectué ce transtypage histoire d'etre sur du caratére positive de l'int. Visiblement ce n'était pas judicieu.
Voila la petite histoire et voila pourquoi ca a finit en abs(...)