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 :

Additionner des chiffres codés sur 5 octets


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 100
    Points : 77
    Points
    77
    Par défaut Additionner des chiffres codés sur 5 octets
    Bonjour,

    Je cherche a additionne un nombre de type t_big.
    Ce type est declare de la maniere suivante :
    typedef char t_big[5];

    Etant donne que ca n'est pas un type de base, comment faire des operations sur ce type signé (j'entend par la que je m'en sert comme type de 5 octets qui contient une valeur correspondant a un nombe);
    A moi de recreer une addition, mais je ne sais pas comment. Quelqu'un peut il m'aider ?

    Merci d'avance
    Menontona

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Tu peux t'y prendre comme tu ferais une addition sur une feuille de papier.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 100
    Points : 77
    Points
    77
    Par défaut

    lol, bon ben on se lance

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 214
    Points : 310
    Points
    310
    Par défaut
    Une méthode moins formatrice peut être simplement de stocker tes nombres entiers sur 5 octets dans un type connu par le système et faisant une taille supérieure ou égale à 5 octets, comme par exemple l'entier 64 bits, supporté par le long long si je ne m'abuse.

    Comme le bit indiquant le signe n'est pas au même endroit, il te faudra un petit quelque chose pour définir correctement tes variables, mais l'addition ne sera plus un obstacle (surtout que maintenant ça se fait le plus souvent en une instruction l'addition, non ?

  5. #5
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Jérôme_C Voir le message
    Une méthode moins formatrice peut être simplement de stocker tes nombres entiers sur 5 octets dans un type connu par le système et faisant une taille supérieure ou égale à 5 octets, comme par exemple l'entier 64 bits, supporté par le long long si je ne m'abuse.

    Comme le bit indiquant le signe n'est pas au même endroit, il te faudra un petit quelque chose pour définir correctement tes variables, mais l'addition ne sera plus un obstacle (surtout que maintenant ça se fait le plus souvent en une instruction l'addition, non ?
    Ce n'est pas moins formateur.
    Cela apprend à convertir des données et faire des trans-typage.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Ensuite il faut comment est géré t_big, ce qu'il contiens comme représentation.

    Est-ce que c'est une string pouvant être converti avec atoi/atol par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdlib.h>
    ...
     
    char carray[5];
    carray[0] = '1'; 
    carray[1] = '9';
    carray[2] = '9';
    carray[3] = '8';
    carray[4] = 0; 
    // print year=1998
    printf("year= %s",carray);

    ou alors sous forme "binaire", pouvant se gérer par exemple avec des opérateurs déballage de bit pour insérer les char dans un long.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // binary representation of 1998
    // 00000000, 00000000, 00000000, 00000111, 11001011
    char tempArr[5]={0x00, 0x00, 0x00, 0x07, 0xCB};
    Dans les deux cas la problématique et les façon de faire sera légèrement différentes
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  7. #7
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 100
    Points : 77
    Points
    77
    Par défaut
    t_byte n'est pas une chaîne de caractère, c'est un octet. Ici j'ai mis que c'etait de type char[5] mais la taille 5 peut changer.

  8. #8
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Menontona Voir le message
    t_byte n'est pas une chaîne de caractère, c'est un octet. Ici j'ai mis que c'etait de type char[5] mais la taille 5 peut changer.
    si c'est char de 5, c'est au moins 5 octets

    Donc c'est une représentation binaire.
    Tu peux essayer quelque chose de ce type pour convertir ton tableau en entier non signé. ensuite il ne reste plus qu'a additionner.
    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>
     
    #define ARRAY_SIZE 5
    int main() {
     
      unsigned char tempArr[ARRAY_SIZE]={0x00, 0x00, 0x00, 0x07, 0xCE};
      int i=0;
      unsigned long long resultat = 0;
     
      for(i=0;i<ARRAY_SIZE;i++) {
        resultat =(resultat<<8) | tempArr[i];
      }
      printf("resultat= %lld \n",resultat); 
      return 0;
    }
    gcc -Wall -Werror convert.c -o convert && ./convert
    resultat= 1998

    Compilation finished at Thu Sep 9 19:37:10
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Attention : un char ne fait pas forcément un octet (même si c'est le plus souvent le cas).

  10. #10
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 100
    Points : 77
    Points
    77
    Par défaut
    Attention : un char ne fait pas forcément un octet (même si c'est le plus souvent le cas).
    Effectivement

    Mon but est de pouvoir additionner des nombres signés stocker sur x octets.
    J'ai vraiment besoin d'une piste. (jabbounet les nombres sont signés)

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Menontona Voir le message
    J'ai vraiment besoin d'une piste.
    Ben comme au primaire
    Tu additionnes les chiffres des unités, tu gardes la retenue que tu reportes sur le chiffre des dizaines puis etc etc

    Comme le problème c'est que tu peux avoir des nombres de taille différente (153 + 27), il te faut bien te positionner.
    Une idée pour régler ce problème serait que tu renverses tes deux nombres => 351 + 72; tu fais l'addition caractère par caractère en balayant tes nombres (3 + 7; 5 + 2; 1 + 0 => 081) puis tu renverses le résultat => 180
    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]

  12. #12
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Menontona Voir le message
    Effectivement

    Mon but est de pouvoir additionner des nombres signés stocker sur x octets.
    J'ai vraiment besoin d'une piste. (jabbounet les nombres sont signés)
    chaque octet est signé??? ou c'est le groupe de x qui represente un entier signé (plus vraisemblable).

    Dans ce cas je suppose que tu dois gérer un bit de signe quelque part.

    je pense que tu devrais jeter un oeil sur les systèmes binaire et la façon d'une façon générale ainsi que sur l'arithmétique binaire, comme ça tu n'auras plus besoin de convertir tes données dans des entiers avant de faire des opérations.

    Tu peux commencer par jeter un oeil sur ces pages:
    http://fr.wikipedia.org/wiki/Syst%C3%A8me_binaire
    http://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_un
    http://fr.wikipedia.org/wiki/Compl%C...nt_%C3%A0_deux

    Le complément à deux risque de t'être utile pour les opération de type addition/soustration en arithmétique signée.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  13. #13
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 100
    Points : 77
    Points
    77
    Par défaut
    Merci pour ces pistes.
    chaque octet est signé??? ou c'est le groupe de x qui represente un entier signé (plus vraisemblable).
    C'est le groupe de x octets qui est signé.

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    tu commence par la fin de tes chaines ensuite tu fait l'addition case par case.
    n'oublie pas le -48 sur tes valeur pour les transformer en int et de stocker la retenu.

    Sa va te donner un truc du type

    retenu = 0
    (x - 48) + (y - 48) + retenu = z
    retenu = z / 10

    le -48 c'est parceque 0 en ascii = 48 donc tu fait la conversion caractère nombre
    et n'oublie pas les premiers nombres a calculer sont les dernier de tes chaines.
    et tu fait case par case c'est le principe d'un calculette a nombre infini.
    Après c'est pour des char* et la j'ai pas mis la gestion du signe -.
    par contre si ton type c'est des champs de bits bah sa marche pas comme sa.

    En même temps ce que tu veut faire me fait penser a mon premier projet de première année :/

  15. #15
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par jouana Voir le message
    tu commence par la fin de tes chaines ensuite tu fait l'addition case par case.
    n'oublie pas le -48 sur tes valeur pour les transformer en int et de stocker la retenu.

    Sa va te donner un truc du type

    retenu = 0
    (x - 48) + (y - 48) + retenu = z
    retenu = z / 10

    le -48 c'est parceque 0 en ascii = 48 donc tu fait la conversion caractère nombre
    et n'oublie pas les premiers nombres a calculer sont les dernier de tes chaines.
    et tu fait case par case c'est le principe d'un calculette a nombre infini.
    Après c'est pour des char* et la j'ai pas mis la gestion du signe -.
    par contre si ton type c'est des champs de bits bah sa marche pas comme sa.

    En même temps ce que tu veut faire me fait penser a mon premier projet de première année :/
    la représentation de ses nombre est binaire et non ascii. cela signifie qu'il utilise la plage de valeur complète de ces char.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  16. #16
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Ouki au temps pour moi

    Bah c'est des manipulation de champ de bit alors :s

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jouana Voir le message
    n'oublie pas le -48 sur tes valeur pour les transformer en int et de stocker la retenu.

    ...

    le -48 c'est parceque 0 en ascii = 48 donc tu fait la conversion caractère nombre
    Exact. Mais vaut mieux faire x - '0' plutôt que x - 48 ce qui évite les problèmes le jour où la valeur ascii du caractère '0' change...
    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]

  18. #18
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Exact. Mais vaut mieux faire x - '0' plutôt que x - 48 ce qui évite les problèmes le jour où la valeur ascii du caractère '0' change...
    dans le principe je suis d'accord avec toi, mais elle est comme ça depuis bien avant ma naissance et le jour ou elle changera les responsables de ce changement pourraient tout aussi bien numéroter à l'envers ou intercaler des lettres au milieu..... ceci dit si çela arrivait dans un standard quelconque je ne crois pas que cela serait très bien suivi
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    dans le principe je suis d'accord avec toi, mais elle est comme ça depuis bien avant ma naissance et le jour ou elle changera les responsables de ce changement pourraient tout aussi bien numéroter à l'envers ou intercaler des lettres au milieu..... ceci dit si çela arrivait dans un standard quelconque je ne crois pas que cela serait très bien suivi
    Exact. En fait c'est plutôt pour une question de lisibilité.
    Si je vois x - 48 je vais chercher pendant au-moins 3mn
    Si je vois x - '0' je me dis de suite "ah oui, il convertit le caractère correspondant à un chiffre en chiffre correspondant" et hop, 3mn de gagnées durant lesquelles je peux prendre un apéro
    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]

  20. #20
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Exact. En fait c'est plutôt pour une question de lisibilité.
    Si je vois x - 48 je vais chercher pendant au-moins 3mn
    Si je vois x - '0' je me dis de suite "ah oui, il convertit le caractère correspondant à un chiffre en chiffre correspondant" et hop, 3mn de gagnées durant lesquelles je peux prendre un apéro
    avec des noix de cajou j'espère
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [WD16] Index fichier de type libellé (codé sur 4 octet)
    Par GCASPIC10 dans le forum WinDev
    Réponses: 11
    Dernier message: 25/02/2015, 11h33
  2. Réponses: 1
    Dernier message: 02/04/2010, 15h14
  3. Réels codés sur 4 octets
    Par plxpy dans le forum Général Python
    Réponses: 4
    Dernier message: 07/05/2009, 15h30
  4. Additionner des chiffres
    Par crush_104 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 02/07/2007, 08h38
  5. Réponses: 2
    Dernier message: 08/01/2007, 16h04

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