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 :

forcer une interpretation en binaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2023
    Messages : 5
    Par défaut forcer une interpretation en binaire
    Bonjour

    Un convertisseur AD me donne un résultat sur 10 bits binaires( donc compris entre 0 et 1023 en équivalent décimal)
    je dois multiplier ce nombre binaire par un nombre 0,37

    J'ai l'intuition que je ne puis faire une simple multiplication d'un type int par un float ( ou un binaire par un float )....vrai ou non ?
    Si je n'ai pas le droit, le plus simple me semble de convertir mon nombre binaire en décimal ( je me suis ecrit une petite routine bin2dec )

    Cela marche nickel si je précise que mon nombre binaire est bien 0bxxxxxxxxxx ;mais si j'oublie le 0b, le nombre est considéré comme un entier et du coup 0b0110010000 qui vaut 400 se retrouve valoir 110010000 !!!

    Question bête...
    1) Comment forcer le soft a considérer par exemple que 0110010000 soit un binaire ( car je ne vois pas le type binaire dans les types du langage...)
    2) Comment éventuellement rajouter 0b en entête du nombre

    je précise...quand le soft tourne, je n'ai pas de clavier pour rajouter ce 0b d'entete manuellement

    Bon, vous avez vu, je débute en C !!!
    merci d'avance pour tout tuyau

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Bonjour,

    Un nombre c'est un nombre. Quand on parle de binaire, décimal, hexadécimal ou que sais-je, ça n'est qu'une convention de représentation. Ce qu'il y a dans une variable c'est un nombre!!!
    Quand tu écris 0b110010000, tu as écrit le nombre que les humains écrivent habituellement 400. Tu pourrais aussi bien l'écrire 0x190 ça n'y changerait rien.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par VF38C4HX Voir le message
    ( car je ne vois pas le type binaire dans les types du langage...)
    Il n'y en n'a pas. Il n'y a que des conventions d'écritures. 97 par exemple c'est du décimal. Mais je peux aussi l'écrire 0x61 (hexa). Ou bien 0141 (octal, comme précisé avec ce "0" obligatoire). Ou bien je peux aussi l'écrire 'a' (valeur ascii du caractère "a" qui vaut 97).
    Ensuite je peux calculer 97+1, ou bien 0x61+1, ou bien 0141 + 1, ou bien 'a' + 1.
    Puis je peux afficher ce résultat au format "%d" (décimal), ou bien "%o" (octal), ou bien "%x" (hexa), ou bien "%c" (caractère). J'aurai alors 98, ou 0142, ou 62, ou 'b'.
    Bref toutes ces notions ne sont qu'une façon de "représenter" la quantité 97 qui reste, en interne, toujours la même.
    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]

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Et donc le code suivant est valide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned int raw = ADC_read_value();
    float cleaned = raw * 0.37f;
    Il n'y a rien de plus à faire.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2023
    Messages : 5
    Par défaut
    merci a tous....mais
    Il semberait que j'aie un probleme avec le compilateur Mplab Ide ( de Microchip )

    mon équation
    float T = raw*0,37f est refusée...
    Il interprete le f comme un digit ( invalid digit 'f' in decimal constant....

    et si je tente sans le f

    float T = raw*0,37, je me retrouve avec un autre message" expression result unused" [Wunused-value]
    bref, suis concé

    je fais un essai sous CodeBlocks:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdio.h>
     
     
    int main()
    {
     
    unsigned int Adc = 0b0110010000; //400
    //unsigned short PotVal = 0000000000;
     
     
     
    float T = (-(Adc*0.3711f) + 400);
     
     printf("PotVal %d\n  T %f\n",Adc,T);
     
        return 0;
    }
    cela donne le resultat attendu...Si je retire le 0b dans unsigned int 'Adc, le résultat est faux ( ou plutôt est juste mais pas ce que j'attends..par ce que le chiffre est considéré comme entier)
    Il faut que je trouve le moyen de specifiier

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    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 769
    Par défaut
    Là c'est compliqué : tu es 1 débutant et en + tu as 1 compilateur limité.

    "invalid digit 'f' in decimal constant" : cela veut sûrement dire que ton compilateur est "exotique". À la fin d'1 nombre on peut forcer sa "précision" en rajoutant 1 lettre : f (ou F apparemment) pour float, L (ou l apparemment) pour long (et peut-être d'autre comme UL)
    "expression result unused" : avertissement pour te dire que tu n'utilises pas la variable. C'est ultra méga classique. Et donc, tu sembles dire que ton compilateur "exotique" la met en erreur.

    Et apparemment l'écriture unsigned int Adc = 0b0110010000; est soit via 1 extension C (gcc : Binary Constants using the ‘0b’ Prefix) soit tu utilises 1 compilateur C++ ( >= C++14)

    Et comme tu es débutant, pour représenter 1 nombre tu as 3 façons :
    • des entiers : normal avec des 0 et des 1
    • des entiers négatifs : complément à 1 ou complément à 2
    • des entiers flottants : format IEC 60559

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VF38C4HX Voir le message
    Si je retire le 0b dans unsigned int 'Adc, le résultat est faux ( ou plutôt est juste mais pas ce que j'attends..par ce que le chiffre est considéré comme entier)
    Ben oui. S'il faut une spécificité pour indiquer une base précise, sans cette spécificité la base est alors prise par défaut dans la base courante (10 dans notre système). C'est comme pour mon exemple avec 0142 (142 en base 8). Si je ne mets pas de "0" devant, alors ce nombre sera considéré comme étant 142 écrit en base 10.

    Citation Envoyé par VF38C4HX Voir le message
    Il faut que je trouve le moyen de specifiier
    Attention, si comme je le crois tu parles d'un nombre "0110010000" lu depuis une entrée IO quelqonque alors dans ce cas ce n'est pas la bonne façon de procéder.
    Si j'entre par exemple au clavier les digits "123", alors cela ne sera jamais compris comme l'entier 123.
    En réalité j'entre 3 caractères '1', '2' et '3' (qui valent respectivement 49, 50 et 51 dans la table ascii). Pour que la suite '1', '2' et '3' soit convertie en valeur 123 il faut utiliser un algorithme de conversion. Pas super compliqué (suffit d'ôter la valeur '0' (=48) à chaque digit, additionner ce résultat à un total qui a été initialisé à 0 au début de l'algo et multiplier ce total par 10 à chaque tour). Pas compliqué mais faut le faire (enfin il existe déjà via les fonctions atoi() ou strtol()).
    Si de ton côté tu veux convertir la suite de digits "0110010000" en valeur binaire 0110010000 il faut utiliser un algorithme similaire (sauf qu'il faut multiplier le total par 2 au lieu de 10).
    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]

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VF38C4HX Voir le message
    Il semberait que j'aie un probleme avec le compilateur Mplab Ide ( de Microchip )
    Enfer et damnation !

    Citation Envoyé par foetus Voir le message
    tu as 1 compilateur limité.
    [...]
    cela veut sûrement dire que ton compilateur est "exotique"
    Non, le mot que tu cherches c'est "pourri" . Microchip a fait quelques compilateurs nuls. J'ai eu des prises de tête infernales sur un projet perso, et c'est un running gag avec des collègues de troller sur les compilateurs Microchip.

    Citation Envoyé par VF38C4HX Voir le message
    mon équation
    float T = raw*0,37f est refusée...
    Il interprete le f comme un digit ( invalid digit 'f' in decimal constant....
    Tente avec double T = raw*0,37;, sait-on jamais. Si, il va falloir ouvrir la doc du compilateur pour voir si c'est supporté sur ton MCU.

    Citation Envoyé par foetus Voir le message
    Et apparemment l'écriture unsigned int Adc = 0b0110010000; est soit via 1 extension C (gcc : Binary Constants using the ‘0b’ Prefix) soit tu utilises 1 compilateur C++ ( >= C++14)
    C'est une extension classique de pas mal de compilateur. De plus, le binaire est très utilisé en embarqué. Je ne suis pas surpris qu'un compilateur de Microchip l'implémente.

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

Discussions similaires

  1. forcer une police speciale sur un site internet
    Par nico_web dans le forum Autres langages pour le Web
    Réponses: 5
    Dernier message: 24/02/2011, 00h24
  2. Forcer une page à s'ouvrir avec Internet Explorer
    Par alexbubs dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 31/10/2005, 10h32
  3. Excel - Forcer l'interpretation comme fonction
    Par azman0101 dans le forum Excel
    Réponses: 1
    Dernier message: 27/10/2005, 16h05
  4. Forcer une deconnexion
    Par Fl0r3nt dans le forum Administration système
    Réponses: 7
    Dernier message: 10/06/2005, 16h30
  5. forcer une fenetre à etre au premier plan jusqu'a ...
    Par peppena dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 22/12/2003, 16h14

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