IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Question sur static_cast


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Question sur static_cast
    Bonjour,

    J'ouvre un fichier via ifstream.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	std::ifstream fichier_in("D:/test.data" , ios::in | ios::binary);
    	if (!(fichier_in.is_open())) { return 1; }
     
    	int size;
    	fichier_in.seekg (0, fichier_in.end); //fin du fichier
    	size = fichier_in.tellg(); //position
    	buffer = new char [size];
    	fichier_in.seekg (0); //fichier_in.seekg (0, fichier_in.beg);
    	fichier_in.read (buffer, size);
    	fichier_in.close();
     
    	variable = static_cast <int> (buffer[4]);
    J'affiche ensuite cette variable pour vérification.
    Je fait cette opération à plusieurs endroits du fichier.

    Mais j'obtiens des résultats bizarres que j'arrive à reproduire en utilisant directement le caractère concerné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		cout << static_cast <int> ('i') << "\n";
    		cout << static_cast <int> ('Ä') << "\n";
    J'obtiens ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    105 <= ok, dans mon fichier c'est 69 en hexa donc 105
    -60 <= ko, dans mon fichier c'est c4 en hexa donc ce devrait être 196
    D'où cela peut-il venir? Si je rajoute 256 à -60 j'obtiens bien 196.
    Le résultat serais toujours compris entre -127 et 128 ? J'aurais aimé avoir 196 dès le début.

    Sinon, est-ce la bonne méthode pour convertir les lettres du fichier en int?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    C'est une simple question de fourchette de valeurs admises...

    Un char (ou un int) est par défaut signé, c'est à dire que les valeurs admises sont équitablement partagées de part et d'autre de 0, le bit de poids le plus fort représentant le signe négatif.

    si tu veux que les valeurs soient représentées dans la fourchette [0,255[ , il faut utiliser des unsigned char, c'est à dire des char non signés.

    De cette manière, le bit de poids fort ne représente plus le signe négatif, mais intervient bel et bien dans l'évaluation de la valeur et permet donc de représenter les valeurs comprises dans la fourchette [128,255[
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci ça marche beaucoup mieux maintenant.
    J'ai l'impression qu'on est pas obligé d'utiliser static_cast pour faire ce que je fais. Pouvez-vous confirmer que les méthode 1 et méthode 2 sont bien équivalente? Ca rend le même résultat apparemment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unsigned char lettre_char;
    int lettre_int;
    cout << static_cast <int> ('Ä') << "\n";
    lettre_char = 'Ä';
    cout << static_cast <int> (lettre_char) << "\n"; //méthode 1
    lettre_int = lettre_char; //méthode 2
    cout << lettre_int << "\n";

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Oui ton static_cast ne sert à rien parce qu'il y a transtypage automatique entre les types entiers.
    Un long long peut contenir un long qui peut contenir un small qui peut contenir un char, et la conversion est automatique.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Invité
    Invité(e)
    Par défaut
    OK, merci beaucoup à tout les deux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo