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 :

Logique de conversion


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2022
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Logique de conversion
    Bonjour,

    Je viens de commencer l'apprentissage du langage C et j'aurais voulu comprendre la logique de conversion dans l'exemple suivant rencontré dans un exemple de programme en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d", '\11'); // Retourne 9
    Pourquoi ? Quelle est la conversion effectuée ?

    Merci par avance à la personne plus expérimentée qui aura la patience de m'expliquer

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par Max_ZT Voir le message
    Pourquoi ? Quelle est la conversion effectuée ?
    Lis la page wikipedia : escape chars

    Le nombre 11 est 1 nombre octal qui vaut 9 en décimal.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2022
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par foetus Voir le message
    Lis la page wikipedia : escape chars

    Le nombre 11 est 1 nombre octal qui vaut 9 en décimal.
    Génial merci beaucoup je viens de comprendre grâce à ta réponse.

    L'échappement au format \nnn interprète en octal et par la suite la conversion demandé dans le printf vers du décimal.

    Merci beaucoup d'avoir pris le temps de répondre à un débutant, c'est bien sympa !

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    C'est la même chose que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf( "%d", 011 );   // 11 octal c'est 9 en décimal
    ou que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf( "%d", 9 );      // Retourne 9
    ou que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf( "%d", '\x09' );  //  9 hexadécimal, c'est 9 en décimal
    ou que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf( "%d", 0x09 );    //  9 hexadécimal, c'est 9 en décimal

  5. #5
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Le même résultat aurait été affiché avec printf("%d",011);
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2022
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse dalfab !

    Si je comprends bien, en plus de pouvoir mettre des chiffres sur différentes base depuis les caractères d'échappement, on peux également ajouter des préfix pour laisser entendre la base utilisée ?

    Octal = 0

    Décimal = À priori rien

    Hexadécimal = 0x ou 0X

    Binaire = Possible ?

    C'est bien ça ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2022
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    https://www.geeksforgeeks.org/intege...ixes-suffixes/

    Top !!! Merci à tous pour vos réponses, je ne comprenais pas la logique de conversion et les formats utilisés.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Attention dans ton lien, il y a du C++ moderne (> C++11)

    En C, tu as comme
    • préfixes : 0 pour l'octal (attention c'est piègeux) et 0x/0X pour l'héxadécimal
    • suffixes : l/ L et ll/ LL. Cela c'est sûr, les autres il faut tester

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2022
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci pour les précisions foetus C'est sympa !

  10. #10
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Bonjour,
    pour être un poil plus précis les simples quotes ' définissent un caractère littéral. Un caractère littéral est de type int et non char comme on pourrait à tort le supposer. Lorsqu'on utilise un «vrai» caractère comme dans 'a', la valeur entière dépendra des différents encodages utilisés. Lorsqu'on utilise une séquence d'échappement on a soit un caractère spécial comme '\t' qui représente un caractère tabulation, soit une valeur en octal comme le précise Foetus dans un '\nnn' ou hexadécimale avec un '\xnn'.

    Donc ici '\11' représente le caractère dont la valeur est en octal 11 (soit 9 en décimal) ; cela signifie que c'est un entier valant 9 en décimal.

    Avec un printf utilisant le spécificateur de conversion %d on demande l'affichage en décimal de la valeur de l'entier passé en paramètre. Ce qui explique l'affichage d'un 9.

    Comme tu es débutant on ne va rentrer trop dans les détails des différents charsets utilisés … car cela devient très vite assez complexe.

  11. #11
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2022
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    Un caractère littéral est de type int et non char comme on pourrait à tort le supposer.
    Bonsoir à toi et merci pour ta réponse super intéressante pour un débutant.

    D'accoooooord, je pensais que c'était la demande conversion dans le printf par exemple ou en utilisant un "(int)" qui aurait explicitement demandé une conversion de type vers du int à partir d'un char.

    Si je fais :

    Il y a donc eu une conversion de type (int > char) qui a été effectuée et non pas un simple affichage car 'a' est un type int depuis le début ?

  12. #12
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Il n'y a pas à proprement parler de «conversion» de type. printf est une fonction variadique (=qui peut admettre un nombre quelconque de paramètre, il lui en faut juste au moins un).
    Dans le code de printf le paramètre format est parsé et lorsqu'un %c est rencontré alors on interprète le paramètre comme un int, puis on le transtype en char/unsigned char/signed char suivant la convention définie (souvent ce sera un unsigned char a priori). transtyper n'est pas convertir … transtype c'est réinterpréter une donnée en la considérant comme étant d'un autre type comme transtyper un int en char. convertir c'est transformer la représentation comme lorsqu'on transforme un double en int par exemple. Mais là c'est un peu poussé pour un débutant.
    Il y a aussi ce qu'on appelle la promotion de type (entre autre dans le cas de fonctions variadiques) qui fait que dans ton code si tu passes un entier plus petit qu'un int alors il sera passé en tant que int, ou si tu passes un float il sera promu en double.

    L'histoire du «les caractères littéraux sont des int» vient du fait qu'à l'origine il y a le fameux EOF qui est un caractère valide en C mais qui n'est pas représentable en tant que char

  13. #13
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par Max_ZT Voir le message
    Binaire = Possible ?

    C'est bien ça ?
    0b pour le binaire , mais n'importe quel bon cours en C , te l'indiquerai.


    Citation Envoyé par Max_ZT Voir le message
    Si je comprends bien, en plus de pouvoir mettre des chiffres sur différentes base depuis les caractères d'échappement, on peux également ajouter des préfix pour laisser entendre la base utilisée ?
    De la façon de comment tu dis, c'est l'impression que c'est une nouveauté , alors que c'est un truc qu'on fait dans les langages depuis plus de 50 ans...
    Vu que tu semble faire du web , en Javascript , c'est pareil que le C à ce niveau là :
    https://developer.mozilla.org/fr/doc...bers_and_dates

    Bref rien de nouveau...

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Max_ZT Voir le message
    Il y a donc eu une conversion de type (int > char) qui a été effectuée et non pas un simple affichage car 'a' est un type int depuis le début ?
    Exact. En C (comme d'ailleurs dans l'informatique en général) tu n'as que du nombre. Tu peux d'ailleurs t'amuser avec printf("%c, %c, %c, %c, %c\n", 'a', 'a' + 1, 'A', 'A' + 1, 'n' - 'a' + 'A') et autres...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    À noter que le langage C impose très peu de contraintes sur l'encodage de ses caractères, notamment il ne garantit pas qu'il s'agisse d'un encodage basé sur l'ASCII.
    Ce que ça veut dire? Tu n'as aucune garantie que 'a'+10 == 'k' (notamment, parce que ça n'est pas le cas en EBCDIC).

    Par contre, la norme garantit que les chiffres de 0 à 9 se suivent, dans cet ordre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Conversion Assembleur Motorola 68xxx en Intel 80xxx
    Par markham dans le forum Autres architectures
    Réponses: 3
    Dernier message: 22/11/2002, 20h09
  2. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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