Utilisation des opérateurs

lawre -  
 lawre -
Bonjour,

Je débute en programmation C++.

lorsque j'écris les instructions suivantes:

#include<iostream.h>
int main()
{
cout<<(signed int)255 <<'\n';
cout<<(unsigned int)255 <<'\n';
cout<<~(signed int)255 <<'\n';
cout<<~(unsigned int)255 <<'\n';
return 0;
}

La console m'affiche

255
255
-256
4294967040

les 2 premiers résultats me semblent logiques mais la suite....
Je croyais que le type "unsigned int" occupait 16 bits. En calculant à la main je trouve 65280 (inversion des 8 bits de poids le + fort à 1 et le reste à 0)pour la 4 ième ligne.
Quand à la 3 ième c un mystère...
pouvez vous m'expliquer le détail de ces résultat.
Note Je tourne sur une machine 32 bits...
Merci

4 réponses

mamiemando Messages postés 33874 Date d'inscription   Statut Modérateur Dernière intervention   7 902
 
Sur un signed tu as un bit de signe, mais pas sur un unsigned.

Par ailleurs :
#include <iostream>

int main()
{
    std::cout<<(signed int)255 << std::endl;
    std::cout<<(unsigned int)255 << std::endl;
    std::cout<<~(signed int)255 << std::endl;
    std::cout<<~(unsigned int)255 << std::endl;
    std::cout<<sizeof(unsigned int)<< std::endl;
    std::cout<<sizeof(signed int)<< std::endl;
    return 0;
}


Tu verras que les unsigned int et signed int sont tous les deux codés sur 4 octets (soit pour un unsigned une valeur comprise entre 0 et 2^32-1, et pour un signed entre -2^31 et 2^31-1 (car 0 est considéré positif).

Or pour le unsigned : ô magie (2^32-1)-255=4294967040
Et pour le signed : le bit de signe est retourné (+ -> - et - -> +), et le fait que 0 soit un nombre considéré posif entraîne le passage de 255 à 256.

Satisfait ? ;)

PS : ne pas utiliser <iostream.h> (obsolète) mais <iostream>. Ceci nécessite de mettre des "std::" devant les cout, endl, et noms de classe STL. mais tu peux aisément court-circuité avec un using namespace std; en début de fichier cpp.

0
lawre
 
Resalut,
merci pour tes réponses:
J'ai bien compris les valeurs retournées. Ouffff!

par contre
"et noms de classe STL. mais tu peux aisément court-circuité avec un using namespace std; en début de fichier cpp. "

J'avoue être largué. Difficile le C++.

Bonne journée à toi
0
mamiemando Messages postés 33874 Date d'inscription   Statut Modérateur Dernière intervention   7 902
 
Hum... En fait pour être rigoureux, il ne faut pas taper cout mais std::cout, comem j'ai fait. Sauf que c'est chiant à taper, donc on peut les sous entendre avec un using namespace std. Par contre utiliser un using namespace std dans un hpp (header), c'est mal. Mais dans ton cas c'est un fichier sources (cpp) donc c'est pas grave.

En gros tu changes iostream.h par iostream, et tu rajoute un using namespace std.
0
lawre
 
Merci pour le tuyau ,j'essaie cettez combinaison.
Bonne journée
0