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 :

Saisie de nombre en complément à 2


Sujet :

C

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Saisie de nombre en complément à 2
    Bonjour,

    Tout est presque dans le titre. Il y a quelques temps, j'avais codé pour le boulot une petite application pour entrer des nombres en console et les convertir en décimal ou en hexadécimal selon le mode d'entrée. Pas de soucis tant qu'on reste sur des nombres positifs et que 0xF est considéré comme valant 15 et non -1.

    Ça s'est très sérieusement corsé quand j'ai voulu passer à des nombres négatifs en compléments à 2. Je voulais que, dans ce cas, 0xF soit interprété comme -1. Pas de soucis pour saisir un nombre négatif et le convertir en hexadécimal si on n'est pas trop exigeant sur le nombre de F rajoutés devant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("-1 = %X\n\n", -1);
    // Sortie : 
    // -1 = FFFFFFFF
    La technique que j'ai adopté pour les nombres saisis en hexadécimal est la suivante :
    1. saisie d'une chaine de caractères
    2. conversion en nombre
    3. si le nombre doit être interprété comme négatif, alors faire un masque pour "étendre le MSB" et avoir tout plein de F ; s'il est positif, alors aucun traitement à cette étape
    4. prendre le complément à 2
    5. afficher le résultat


    Globalement, ça marche bien. 0xF est interprété comme -1 ; 0x0F comme 15.

    J'ai deux soucis :
    1. le traitement aux limites, pour détecter les dépassements de format
    2. la portabilité du masque car il est fait de façon bourrin :
      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
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
                  // Traitement particulier pour les nombres negatifs
                  if( !(str[0]>='0' && str[0]<'8') )
                  {
                      // Extend MSB
                      switch(strlen(str))
                      {
                          case(1):
                              number = 0xFFFFFFF0UL | number;
                              break;
                          case(2):
                              number = 0xFFFFFF00UL | number;
                              break;
                          case(3):
                              number = 0xFFFFF000UL | number;
                              break;
                          case(4):
                              number = 0xFFFF0000UL | number;
                              break;
                          case(5):
                              number = 0xFFF00000UL | number;
                              break;
                          case(6):
                              number = 0xFF000000UL | number;
                              break;
                          case(7):
                              number = 0xF0000000UL | number;
                              break;
                          case(8):
                              number = 0x00000000UL | number;
                              break;
                          default:
                              printf("WTF?\n");
                              number = 0;
                              break;
                      }

    Je travaille sous XP en 32 bits, donc un long fait 4 octets. Quand je vais passer sur 64 bits...

    Je ne suis pas certain que ma méthode soit la bonne.... Et je viens donc demander vos avis ! Je vous joins un fichier compilable pour les plus motivés d'entre vous : il donne une application console où vous n'avez qu'à taper des nombre en hexa et faire ENTREE. La boucle se termine quand vous entrer 0.

    Merci d'avance pour vos remarques

    Bktero.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [Débutant] Saisie de nombre par l'utilisateur en matlab
    Par bsangoku dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/04/2010, 07h39
  2. Limiter la saisie à un nombre de caractère
    Par 0nn2belle dans le forum C
    Réponses: 8
    Dernier message: 04/12/2008, 17h09
  3. masque saisie format nombre
    Par ninette24 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/07/2008, 13h29
  4. Empêcher la saisie de nombre ou de caractère
    Par SOPSOU dans le forum Langage
    Réponses: 3
    Dernier message: 28/08/2007, 17h27
  5. [JFormattedTextField] Saisie des nombres
    Par n00bi dans le forum Composants
    Réponses: 2
    Dernier message: 20/06/2005, 14h23

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