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 :

Définir l'octet à utiliser ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Par défaut Définir l'octet à utiliser ?
    Salut à tous.
    Disons que je veux stocker une valeur numérique entre 0 et 200 dans une variable.

    Est-ce que je peux définir une variable de 1 octet pour cela ?
    Si oui, comment on s'y prend ?

    Pas de char.
    Le but c'est de savoir si on peut définir des variables de 1,2,3,etc octet et comment le faire.)

  2. #2
    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
    tu peux utiliser unsigned char, qui fait accepte au minimum les valeurs [0..255]
    Sinon, il faut regarder cette documentation sur les types communs (disponibles depuis C99)

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kripteks Voir le message
    Pas de char.
    C'est bête parce que c'est ça que tu dois utiliser...

    Tu peux suivre le lien de leternel et choisir l'uint8_t, mais il y a une chance très importante que cela soit un typedef pour.... unsigned char.

    Pour les types de tailles précises, tu peux utiliser les types uint8_t, uint16_t, uint32_t mais ils sont optionnels. Pour des longueurs intermédiaires (3 bytes par exemple), il ne te reste guère que les tableaux de bytes.

  4. #4
    Membre très actif
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Par défaut
    Merci.

    Je mélange un peu les choses.

    Le nombre d'octet et la valeur min-max utiliser par signed int et unsigned int est fixé par: os, cpu, c, version c ?

  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
    Il existe une plage minimale légale, définit par la norme du C (qui est un traité...)
    Par ailleurs, chaque compilateur fait ce qu'il veut tant qu'il la respecte.

    La première cause de variation, c'est l'architecture du processeur (32 bits, 64 bits, micro-proc en tous genres), et l'OS (c'est surtout visible dans les grandes tailles).

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Je rajouterai : par le compilateur.

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 300
    Par défaut
    Je rajouterais qu'une valeur numérique est normalement stocké dans un int. La taille d'un int est calé sur le mot machine du cpu de destination je crois.

    Stocker ton nombre dans un unsigned char te permettras de le stocker dans un octet maximum, mais pourrais t’empêcher d'utiliser des fonctions notamment mathématiques requérant un int.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    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 495
    Par défaut
    Bonjour,

    Citation Envoyé par kripteks Voir le message
    Je mélange un peu les choses.
    Le nombre d'octet et la valeur min-max utiliser par signed int et unsigned int est fixé par: os, cpu, c, version c ?
    Pas par l'OS, sauf si celui-ci est naturellement limité en taille, par exemple si tu installes un OS 32 bits sur une machine 64. Et là encore, rien ne t'empêchera d'utiliser ton compilateur pour faire de la compilation croisée. Pour le reste, le C va définir une poignée de types entier : char, int, short int, long int, etc. et leur imposer une largeur minimale, ce qui est important car toutes les architectures ne travaillent pas au niveau de l'octet : certaines utilisent des mots de 7 ou 12 bits, d'autres ne savent pas descendre en dessous de 32. À noter que les x86, depuis le 386, travaillent artificiellement « au dessous » de 32 bits : les adresses mémoire sont exprimées en octets mais, en pratique, c'est le même mot qui est chargé depuis la mémoire et c'est le micro-processeur qui se charge d'extraire la bonne valeur. D'où l'importance de l'alignement en mémoire quand on utilise des données de 16 ou 32 bits pour ne pas charger inutilement « deux demi-mots » plutôt qu'un seul mot entier.

    « char » est le plus petit entier signé, et doit être de taille suffisante pour représenter le jeu de caractère de base défini par la norme, soit 91 caractères. Étant donné que l'octet est en général l'unité minimum manipulable par la trèsgrande majorité des micro-processeurs, un char équivaut généralement à un octet mais tu peux utiliser la macro CHAR_BIT pour t'en assurer : si celle-ci vaut « 8 », tu es sûr de manipuler la bonne taille.

    Toutefois, comme dit plus haut par leternel, il te faudra plutôt déclarer « #include <stdint.h> » et utiliser les types nouvellement définis, comme int8_t, uint8_t, int16_t, etc. La largeur de ceux-ci est indiquée dans le nom de type et est censée être garantie. Ce sont sans hésitation les types à utiliser si tu as réellement besoin d'utiliser des entiers de taille fixe, par exemple, si tu travailles sur des données à exporter.

    Pour faire court :
    — Les types natifs char, int, long, short existeront forcément sur tous les compilateurs et auront une largeur minimum garantie, mais celle-ci pourra être adaptée pour coller aux spécifications de l'architecture-cible ;
    — Les entiers standard int8_t, int16_t, etc. auront une largeur fixe garantie, mais pourront ne pas être disponibles si l'architecture-cible n'est pas capable de les prendre en charge.

Discussions similaires

  1. Définir dbConnection sans utiliser le fichierApp Config
    Par tinhinan6 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/04/2014, 13h09
  2. Utilisation indice pour définir la div utilisée
    Par tijoh dans le forum jQuery
    Réponses: 2
    Dernier message: 04/07/2013, 15h57
  3. Réponses: 3
    Dernier message: 08/01/2008, 16h53
  4. [VS 2005] Comment définir la version du framework à utiliser?
    Par therock dans le forum Visual Studio
    Réponses: 1
    Dernier message: 04/08/2006, 05h08
  5. Réponses: 7
    Dernier message: 07/09/2004, 14h16

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