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 :

Valeur negatif hexadecimal dans define ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 85
    Par défaut Valeur negatif hexadecimal dans define ?
    Bonjour,

    Je cherche le moyen d'initialiser une chaine de caractère avec des nombres dans chaque " cases ", comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char s[4];
     
    s[0] = '10';
    s[1] = '32';
    s[2] = '56';
    s[3] = '\0';
    Pour ce faire j'écris le chiffre en hexadecimal, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define EXEMPLE "\xA\x20\x38\0"
    Cependant, je fais comment si je veux que ma define possède des chiffres négatif ? Pour le caractère 0 par exemple -0xA, mais ma define ne passe pas la compilation ...
    Merci pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 768
    Par défaut
    Il faut regarder la norme, mais, la valeur du signe c'est le bit le plus à gauche

    Pour 3, c'est "00000011", donc avec un char négatif, c'est 10000011 soit 0x83.
    Avec un short (16 bits), c'est 0x8003

    Édit: Ceci c'est pour les nombres flottants. Pour les entiers, on utilise le complément à 2 qui permet de faire des additions.
    Mais, la valeur du signe c'est le bit le plus à gauche


    Le mieux c'est de stocker en plus de ton nombre un booléen "is_positive"/ "is_negative"

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 85
    Par défaut
    hum ce que tu me dis foetus ne m'arrange pas du tout, je voulais évité de rajouter une variable à ma structure uniquement pour deux cas ... je vais voir si je peux pas faire autrement, en attendant je laisse encore le topic ouvert voir s'il y a pas d'autres solution, merci

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    La première réponse de fœtus est certainement la solution à ton problème. Regarde le principe du complément à deux.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Je pense surtout que la bonne solution, c'est de regarder comment tu en es arrivé à cette technique, et si tu ne pourrais pas faire quelque chose de plus simple.

    Car regarder la valeur hexa d'une chaine pour initier un tableau d'entier, ca commence à être un peu gros.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 85
    Par défaut
    Bonsoir,

    Je pense surtout que la bonne solution, c'est de regarder comment tu en es arrivé à cette technique, et si tu ne pourrais pas faire quelque chose de plus simple.

    Car regarder la valeur hexa d'une chaine pour initier un tableau d'entier, ça commence à être un peu gros.
    Afin de contourner la norme d'epitech.

    J'ai des define correspondant au valeur des touches (chaine de caractères), que je compare avec celle entrée au clavier, si la touche correspond a une touche que je gère j'appelle la fonction correspondante. Exemple : (une partie du header et du "code" )
    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
     
    /* HEADER */
    typedef struct s_type
    {
          char *key;
          void  (*f)();
    }
     
    /* CODE */
    //Declarer en globale (pour la norme) UP & DEL sont des defines
    static t_type key[] = 
    {
         {UP, &my_up},
         {DEL, &my_del},
         {NULL, NULL}
    };
    Si vous avez une solutions plus propre je suis preneur...

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    Citation Envoyé par sbill Voir le message
    Je cherche le moyen d'initialiser une chaine de caractère avec des nombres dans chaque " cases ", comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char s[4];
     
    s[0] = '10';
    s[1] = '32';
    s[2] = '56';
    s[3] = '\0';
    Les apostrophes « ' ' » servent à désigner un caractère isolé et renvoient la valeur de ce caractère, c'est-à-dire son code ASCII ou plus généralement sa position dans la table de caractères en vigueur. Ils doivent donc contenir soit le caractère concerné, soit une séquence spéciale qui le désigne comme « \n », « \r », « \t », ou « \0 » pour le caractère nul. L'expression entière est alors de type char, donc un type numérique entier.

    Par conséquent, si tu connais déjà les valeurs de ces caractères, alors il faut les spécifier directement, sans les apostrophes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s[0] = 10;
    s[1] = 32;
    s[2] = 56;
    s[3] = 0;
    … et comme il s'agit alors de types numériques ordinaires, rien ne t'empêche de les préfixer par un signe « moins » :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s[0] = -10;
    s[1] = -32;
    s[2] = -56;
    s[3] = -0;
    Enfin, il est important de noter que comme les apostrophes forment une expression de type entier, celle-ci peut elle aussi être soumise aux règles de l'arithmétique et être préfixée par un « - » si nécessaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s[0] = -'A';
    s[1] = -'B';
    s[2] = -'C';
    s[3] = 0;


    Pour ce faire j'écris le chiffre en hexadecimal, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define EXEMPLE "\xA\x20\x38\0"
    Cependant, je fais comment si je veux que ma define possède des chiffres négatif ? Pour le caractère 0 par exemple -0xA, mais ma define ne passe pas la compilation ...
    Merci pour votre aide.
    Ce n'est pas faisable directement au sein d'une chaîne et il me semble que la norme précise que des caractères ainsi spécifiés sont de type « unsigned char », mais je ne sais plus si c'est systématique ou seulement en cas de dépassement. Quoi qu'il en soit, rien ne t'empêche d'utiliser la méthode ci-dessus et d'appliquer ensuite le même négateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s[0] = -0x0a;
    s[1] = -0x20;
    s[2] = -0x38;
    s[3] = -0x0;
    Citation Envoyé par foetus Voir le message
    Il faut regarder la norme, mais, la valeur du signe c'est le bit le plus à gauche

    Pour 3, c'est "00000011", donc avec un char négatif, c'est 10000011 soit 0x83.
    Avec un short (16 bits), c'est 0x8003
    Oulala ! Pas du tout !

    Les entiers en C suivent le binaire naturel : « -3 » sur huit bits s'écrit « 11111101 » , soit « 0xFD ». Le fait d'utiliser exactement la moitié de la plage pour les nombres positifs ou nuls et l'autre pour les négatifs, sachant qu'un bit peut prendre exactement deux valeurs, fait que le bit de poids fort d'un entier va toujours être nul dans le premier cas et valoir 1 dans l'autre. Cela se démontre aisément et peut donc être garanti. Mais c'est là une conséquence directe du mode de calcul et pas une convention posée d'emblée au départ.

    C'est à ne pas confondre avec les nombres à virgule flottante au format IEEE 754, qui est un format composite, défini par convention, géré logiciellement et pour lequel sont apparues ensuite des puces dédiées lorsqu'ils se sont définitivement imposés.

    Le mieux c'est de stocker en plus de ton nombre un booléen "is_positive"/ "is_negative"
    Je ne sais pas si c'était de l'ironie, mais tu es bien d'accord que ce n'est pas un conseil à donner.

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 18/03/2005, 09h23
  2. Sélection valeur par défaut dans une zone de liste
    Par Cécile154 dans le forum IHM
    Réponses: 2
    Dernier message: 15/02/2005, 18h20
  3. Valeur par default dans un input file ?
    Par alainme dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 11/02/2005, 14h31
  4. Valeur par défaut dans une table objet
    Par Ricky81 dans le forum Oracle
    Réponses: 12
    Dernier message: 18/03/2004, 11h52
  5. Réponses: 2
    Dernier message: 23/11/2003, 18h44

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