Utilisation des opérateurs
lawre
-
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
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
A voir également:
- Utilisation des opérateurs
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- La ressource demandée est en cours d'utilisation - Forum Téléphones & tablettes Android
- Family link bug temps d'utilisation - Forum Contrôle parental
- Logiciel en Cours d'utilisation ? ✓ - Forum Logiciels
4 réponses
Sur un signed tu as un bit de signe, mais pas sur un unsigned.
Par ailleurs :
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.
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.
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
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
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.
En gros tu changes iostream.h par iostream, et tu rajoute un using namespace std.