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 :

Le type (un)signed long long / __int64 ; compte bancaire


Sujet :

C

  1. #1
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut Le type (un)signed long long / __int64 ; compte bancaire
    Bonjour à tous,

    Dans un de mes programmes en C, je dois vérifier la structure d'un compte bancaire de type: xxx - xxxxxxx - xx (14 caractères).

    Ma fonction actuelle me permet de récupérer les 3 premiers chiffres que je compte multiplier par 10 000 000 et y ajouté les 7 chiffres suivants.

    Actuellement, ça se fait. Enfin, ça se fait... si c'était réellement vrai, je ne serais pas là !

    Il s'avère que pour un compte de type 667-1234567-89 (ce numero n'est pas valide, évidemment !), le résultat attendu est x = (667 * 10000000) + 1234567 = 6 671 234 567.

    Cependant, le type le plus volumineux que je peux utiliser est un unsingled long, qui va au grand maximum à un peu plus de 4 000 000 000 ; ce qui n'est donc pas assez.

    Après recherche, il existe deux solutions:
    - décomposé le chiffre en deux et faire son modulo séparément, additionné le modulo et j'obtiens le modulo initialement prévu.
    - utilisé le type (un)signed long long ou encore __int64.

    Concernant la première solution, elle m'a été demandée de ne pas m'en servir.

    Pour la deuxième, mon compilateur n'accepte pas le long long (norme C99, or je suis en norme C90 sous Borland C++ 4.5) et le __int64 ne se compile pas non plus.

    Quelqu'un aurait-il une solution à m'indiquer ? Une piste à suivre ?

    Merci d'avance !

  2. #2
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    Encore moi ! J'ai trouvé une piste qui me satisfait (puisque ça fonctionne :p).

    En fait, je voulais travaillé avec des int/long pour pouvoir utiliser le modulo qui ne s'effectue que sur des entiers.

    Cependant, il existe le fmod (float modulo) qui s'effectue donc sur des float/double.

    J'ai utilisé un double, et c'est fonctionnel à merveille !

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Un double pour des comptes en banque ?

    Je n'aurais pas confiance: virgule flottante veut dire que si le nombre devient "trop" grand, la précision en est affectée...

  4. #4
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    La taille ne change jamais. C'est la structure que j'ai besoin, donc 3chiffres-7chiffres-2chiffres.

    Mon but est que les dix premiers chiffres modulo 97 = les deux derniers.

    La fonction fmod() est standard (math.h) et me retourne le reste de la division comme un modulo classique. Il n'y a donc aucun soucis de précisions.

  5. #5
    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
    Si c'est uniquement pour calculer le nombre modulo 97, il n'y avait pas besoin de se poser la question de stocker le nombre dans une variable.

    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      char tab[]={66,71,23,45,67};
    ....
      for(i=0, mod=0; i<sizeof tab; i++) mod = (3*mod+tab[i]) %97;
    // le résultat est dans mod 
    // le *3 vient du fait que 100%97 ==3
    et on n'est même pas limité à 10 chiffres

  6. #6
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    Sans nuls doutes, sauf que je ne pouvais pas utiliser ce système. Il m'a été demandé de ne pas utiliser une méthode qui scindait le nombre. Comme celle-ci donc,

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 10/04/2009, 11h27
  2. [Langage] printer un type ''long long"
    Par uriotcea dans le forum Langage
    Réponses: 6
    Dernier message: 17/11/2008, 20h50
  3. code contenant un type long long
    Par Bayard dans le forum C
    Réponses: 3
    Dernier message: 02/10/2007, 15h02
  4. Réponses: 6
    Dernier message: 06/12/2005, 17h54
  5. DBLink et types LONG/LONG RAW
    Par bchristo dans le forum Administration
    Réponses: 7
    Dernier message: 28/04/2004, 13h46

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