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

Delphi Discussion :

Valeur négative en binaire sur 2 octets


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut Valeur négative en binaire sur 2 octets
    Bonjour,

    Comment sont codées les valeurs négatives dans delphi ?

    J'ai des valeurs négatives dans mon appli sur 2 octets (SmallInt). Le truc c'est que je dois découper cette valeur en 2 fois 8 bits en utilisant le complément à 2. Pour découper ma valeur, j'applique des masques (and) et je fais des décalages de bits (shr). Mais voilà, il semblerait que ça ne fonctionne pas... ça marche parfaitement pour les valeurs positives, mais pas pour les valeurs négatives...

    Une idée ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Les nombres négatifs sont représentés au moyen du complément à 2.

    Le type smallint codé sur 16 bits a une étendue de –32768 à +32767.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Binaire                   |    Décimal
         ------------------------------------
     
          0000 0000 0000 0000   |  0
          0111 1111 1111 1111   |  + 32767
          1000 0000 0000 0000   |  - 32768
          1111 1111 1111 1111   |  - 1
    Le type de la variable définit la taille et la signification des octets.
    Remarque: Le bit le plus significatif de l'octet de poid fort est toujours à 1 pour un nombre négatif.

  3. #3
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Bonjour,

    C'est exactement ce que j'avais compris, et pourtant ça ne fonctionne pas :/
    A la base ma valeur est un integer. Alors je fais monSmallInt := monInteger;

    Donc ceci devrait être correct ?

    Ensuite je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          // Extraire l'octet de poid fort
          octetFort := (monSmallInt and $FF00) shr 8;
          // Extraire l'octet de poid faible
          octetFaible := monSmallInt and $FF;
    Je ne vois pas ce qui coince... Avec les valeurs positives ça fonctionne très bien :/

  4. #4
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    La question c'est que je manipule des integers. Puis je dois les découper en 2 octets (un octet de poid fort et un octet de poid faible). Comme l'integer est codé sur 32 bits et non 16, je veux d'abord convertir ma valeur qui se code obligatoirement sur 16bit. Donc je fais comme indiqué plus haut... Mais ça ne marche pas

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button12Click(Sender: TObject);
    var
      I16: SmallInt;
      I32: Integer;
      LB8, HB8: Byte;
    begin
     I32 := -32768;
     I16 := I32;
     showMessage(IntToStr(I16));
     LB8 := I16 and $FF   ;
     HB8 := (I16 and $FF00) shr 8;
     ShowMessage(IntToStr(LB8));  // -> 0
     ShowMessage(IntToStr(HB8));  // ->128
    end;
    Les résultats sont conformes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      -32768  |  1000 0000 0000 0000       |  I16  
     0        |            0000 0000       |  LB8
     +128     |  1000 0000                 |  HB8
    Rappel
    type Byte non signé 0-255
    0 -> 0000 0000
    128 -> 1000 0000
    255 -> 1111 1111

  6. #6
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Si j'ai bien compris ça confirme ma méthode. Je vais chercher du côté du périphérique qui doit mal interprété le complément à 2.

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

Discussions similaires

  1. [XL-2010] Suppression valeurs négatives sur une échelle
    Par Billou265 dans le forum Excel
    Réponses: 4
    Dernier message: 28/07/2010, 12h07
  2. Réponses: 3
    Dernier message: 08/04/2009, 12h10
  3. ecrire valeur int sur 3 octets
    Par Septembre84 dans le forum Langage
    Réponses: 1
    Dernier message: 06/06/2008, 14h11
  4. récupération d'une valeur sur deux octets
    Par sanatou dans le forum C++
    Réponses: 6
    Dernier message: 09/01/2007, 16h35

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