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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 100
    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 Expert
    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
    Par défaut
    Tu peux t'y prendre comme tu ferais une addition sur une feuille de papier.

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

    lol, bon ben on se lance

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 214
    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 : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    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.

  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 : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    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

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 100
    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 : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    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

  9. #9
    Membre Expert
    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
    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 confirmé
    Inscrit en
    Mai 2006
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 100
    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)

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

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