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 :

"Concaténer" deux "chars" de 8bits en un "int" de 16 bits


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut "Concaténer" deux "chars" de 8bits en un "int" de 16 bits
    Bonsoir à tous,

    Voilà, je programme en ce moment pour un projet scolaire un microcontrolleur (un PIC16F876A de chez Microchip) en C.

    Celui ci possède un CAN de 10bits (un outil qui capture une tension envoyée sur une broche du microcontrolleur en gros) qui stocke le résultat d'une mesure dans deux registres (je ne sais pas si ils sont contigus en mémoire mais dans le doute on va dire que non, le pointeur est donc à prohiber) de 8bits.

    En gros les 8 Bits les plus significatifs de ma valeur sont stockée dans un premier registre et les 8 bits les moins significatifs dans un second.

    Par exemple, si mon CAN de 10 bits renvoie la valeur maximale (1023 en décimal donc, soit 0000001111111111 en binaire sur 16bits), mon registre 1 (ADRESH c'est son nom) contiendra "00000011" et l'autre (ADRESL) contiendra "11111111".

    Concrètement j'aimerais savoir comment faire en C pour concaténer ces deux registres en une seule variable (un int sur 16bits donc) pour pouvoir ensuite faire des calculs sur la variable entière.

    Je cherche un opérateur ou autre moyen de faire cela : un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat = ADRESH + ADRESL
    sauf que ça m'étonnerait que ça marche avec un plus^^

    Un grand merci d'avance à vous.

    Spartan03
    Pourquoi faire simple quand on peut faire compliqué!

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Regarde vers l'opérateur de décalage << combiné avec l'opérateur OU "bit à bit" |
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Pas con du tout^^

    Merci beaucoup pour ta réponse rapide, en effet ça marche nickel, je ne connaissait pas l'existence de l'opérateur OU bit à bit "|", seulement le OU logique "||".

    J'ai fait un petit programme en C "PC" (ça reste en mode console^^) pour tester ça (il me donne r =767 soit 1011111111 en binaire donc c'est nickel), le voici

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        unsigned char a = 2; //00000010(bin)=2(dec)
        unsigned char b = 255;//11111111(bin) = 255(dec)
        unsigned int r = 0; //0(dec) = 0000000000000000(bin)
     
        r = a << 8; // On met en 8 LSBs de r les 8 bits de a puis on les décale de 8 bits pour faire place ou 8 LSBs (à b donc) et ainsi les placer en position de MSBs
        r = r | (unsigned int)b;//On réalise un OU bit à bit afin de mixer la valeurs de r contenant les 8MSBs et b contenant les 8 LSBs
     
     
        printf("a=%d\nb=%d\nr=%d", (unsigned int)a, (unsigned int)b, (unsigned int)r); //Impression du résultat sur une console pour vérifier que tout fonctionne ==> Ca marche
        return 0;
    }
    Encore merci à toi diogène!
    Bonne soirée!
    Pourquoi faire simple quand on peut faire compliqué!

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 168
    Points
    168
    Par défaut
    Tu peux aussi utiliser une union:

    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(void)
    {
        union {
          struct {
            unsigned char b;
            unsigned char a;
          } s;
          unsigned short int r;
        } u;
     
        u.s.a = 2;
        u.s.b = 255;
        printf("a=%u\nb=%u\nr=%u", u.s.a, u.s.b, u.r);
        return 0;
    }

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par magma² Voir le message
    Tu peux aussi utiliser une union:

    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(void)
    {
        union {
          struct {
            unsigned char b;
            unsigned char a;
          } s;
          unsigned short int r;
        } u;
     
        u.s.a = 2;
        u.s.b = 255;
        printf("a=%u\nb=%u\nr=%u", u.s.a, u.s.b, u.r);
        return 0;
    }
    Ce code est non portable et a un comportement indéterminé (taille des type, padding, lecture d'un membre de l'union qui n'est pas le dernier écrit).

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par magma² Voir le message
    Tu peux aussi utiliser une union:
    Surtout pas. Ce n'est pas du tout portable. Cette méthode est à proscrire absolument. La bonne méthode a été donnée.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Concaténation de deux tableaux
    Par mego dans le forum Langage
    Réponses: 6
    Dernier message: 19/11/2008, 11h52
  2. [VB6] "Concaténation" de deux images en une seule
    Par KrusK dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 07/07/2006, 09h45
  3. concaténation sur deux critères
    Par stéphane_ais2 dans le forum Access
    Réponses: 7
    Dernier message: 29/11/2005, 09h37
  4. [postges] concaténation de deux identifiants
    Par Alex35 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 27/10/2005, 16h37
  5. Concaténation de deux integer pour former une clé primaire
    Par stoukou dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 08/09/2005, 10h34

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