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ébutant] utiliser un unsigned char au lieu d'un u. short


Sujet :

C

  1. #1
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut [Débutant] utiliser un unsigned char au lieu d'un u. short
    Bonjour tout le monde,

    Je me pose la question suivante, est-il préférable d'utiliser un unsigned char qui va prendre un seul octet au lieu d'un unsigned short si je veux créer une boucle comme dans l'exemple ci-dessous ?
    Le nom char me trouble mais il n'est pas réservé au stockage de code ASCII ?

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned char i = 1;
     
    while(i < 255)
    (
    i++;
    )
    Une autre petite question sur le même sujet, je vois qu'un int peut faire 2 ou 4 octets mais quand je déclare :

    unsigned int i;

    est-ce que seulement 2 octets sont réservés ou 4 ?

    Merci d'avance pour vos réponse
    Bye

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par Djakisback
    Je me pose la question suivante, est-il préférable d'utiliser un unsigned char qui va prendre un seul octet au lieu d'un unsigned short
    Si un jour tu dois boucler plus, tu peux prendre un short, sinon tu peux garder un char. Sachant que cette variable n'est pas globale, tu ne sauvera rien (à part un peu de stack) à la déclarer char au lieu de short.

    Le nom char me trouble mais il n'est pas réservé au stockage de code ASCII ?
    Nom.


    Une autre petite question sur le même sujet, je vois qu'un int peut faire 2 ou 4 octets mais quand je déclare :

    unsigned int i;

    est-ce que seulement 2 octets sont réservés ou 4 ?
    Ça dépend de ta machine : le type int n'est pas portable. Si tu veux 16 bits tu prends un short, sinon un long,et tu seras sur de ton coup.
    Pour ta question, dans la plupart des cas d'usages "normaux" ( un pentium avec windows), le int sera sur 32 bits.

  3. #3
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Ok, merci beaucoup pour ta réponse

    Mais donc si la variable est grlobale il vaut mieux utiliser un char ?

    Pour le int, j'aurais pu pensé à faire le test avec sizeof() j'imagine :/ Ca fait bien 4 octets chez moi. Au sujet de la portabilité, il n'y a donc aucun intérêt à utiliser un int sans préciser si c'est un short ou un long ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut
    Citation Envoyé par Djakisback
    Mais donc si la variable est grlobale il vaut mieux utiliser un char ?
    Si c'est un tableau de 2000000 variables, tu sauveras 2 Meg de RAM à utiliser un char au lieu d'un short. Si c'est une seule variable, à toi de voir si tu as besoin de sauver 1 octet de plus

    Au sujet de la portabilité, il n'y a donc aucun intérêt à utiliser un int sans préciser si c'est un short ou un long ?
    C'est même plutôt le contraire ...

  5. #5
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    D'accord. Je vais quand même faire le rapace sur les octets

    Merci pout tout

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par DavG
    Citation Envoyé par Djakisback
    Mais donc si la variable est grlobale il vaut mieux utiliser un char ?
    Si c'est un tableau de 2000000 variables, tu sauveras 2 Meg de RAM à utiliser un char au lieu d'un short. Si c'est une seule variable, à toi de voir si tu as besoin de sauver 1 octet de plus

    Au sujet de la portabilité, il n'y a donc aucun intérêt à utiliser un int sans préciser si c'est un short ou un long ?
    C'est même plutôt le contraire ...
    En es-tu si sûr ? N'oublie pas l'alignement des données en mémoire, un octet prend autant de place qu'un int en mémoire je crois.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut
    Citation Envoyé par Trap D
    En es-tu si sûr ? N'oublie pas l'alignement des données en mémoire, un octet prend autant de place qu'un int en mémoire je crois.
    Tout dépend des options de compilation ou de l'alignement donné autour de tes structures (tu peux choisir d'aligner sur 1, 2 ou 4 bytes avec les pragma pack).

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par Djakisback
    Je me pose la question suivante, est-il préférable d'utiliser un unsigned char qui va prendre un seul octet
    Oui, non, peut être... Dépend de la plateforme...
    au lieu d'un unsigned short si je veux créer une boucle comme dans l'exemple ci-dessous ?
    Le nom char me trouble mais il n'est pas réservé au stockage de code ASCII ?
    Non. C'est un entier comme les autres, sauf qu'on ne sait pas si il est signé ou non. Si ça a son importance, on peut le qualifier avec 'signed' ou 'unsigned'. Les limites de [[un]signed ]char sont définies dans <limites.h>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char          : CHAR_MIN  .. CHAR_MAX
    unsigned char : 0         .. UCHAR_MAX
    signed char   : SCHAR_MIN .. SCHAR_MAX
    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned char i = 1;
     
    while(i < 255)
    (
    i++;
    )
    int ou unsigned int. Laisse faire la nature...
    Une autre petite question sur le même sujet, je vois qu'un int peut faire 2 ou 4 octets mais quand je déclare :

    unsigned int i;

    est-ce que seulement 2 octets sont réservés ou 4 ?
    Aucune idée. Un int est défini par sa gamme de valeur. INT_MIN .. INT_MAX sont définis dans <limits.h>

    http://emmanuel-delahaye.developpez.com/init_c.htm#type

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Djakisback
    Mais donc si la variable est grlobale il vaut mieux utiliser un char ?
    Non int est la taille 'naturelle'. C'est celle qui génère le moins de code parasite (extension, masquage... le char est une plaie en x86...)
    Pour le int, j'aurais pu pensé à faire le test avec sizeof() j'imagine :/ Ca fait bien 4 octets chez moi. Au sujet de la portabilité, il n'y a donc aucun intérêt à utiliser un int sans préciser si c'est un short ou un long ?
    La portabilité se résout en terme de gamme minimale garantie.

    http://emmanuel-delahaye.developpez.com/init_c.htm#type

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par DavG
    Une autre petite question sur le même sujet, je vois qu'un int peut faire 2 ou 4 octets mais quand je déclare :

    unsigned int i;

    est-ce que seulement 2 octets sont réservés ou 4 ?
    Ça dépend de ta machine : le type int n'est pas portable. Si tu veux 16 bits tu prends un short, sinon un long,et tu seras sur de ton coup.
    Pour ta question, dans la plupart des cas d'usages "normaux" ( un pentium avec windows), le int sera sur 32 bits.
    La taille des short et des long n'est pas plus garantie que celle des int, celle la taille minimale est garantie

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par gl
    La taille des short et des long n'est pas plus garantie que celle des int, celle la taille minimale est garantie
    Je viens de l'apprendre : depuis le temps que je programme, je n'ai jamais vu de short autre que 16 bits .... qui utilises ça ???

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par DavG
    Citation Envoyé par gl
    La taille des short et des long n'est pas plus garantie que celle des int, celle la taille minimale est garantie
    Je viens de l'apprendre : depuis le temps que je programme, je n'ai jamais vu de short autre que 16 bits .... qui utilises ça ???
    En regardant dans la doc du C99, les types suivants sont définis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <stdint.h> 
     
    typedef short int16_t;
    typedef long int32_t;
    Ce qui me confirme dans l'idée qu'on peut assumer qu'un short c'est 16 bits et un long 32 ... à moins que je n'ai manqué quelque chose

  13. #13
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Resalut

    très intéressant ces reponses supplémentaires, même si je capte pas tout. Jvais mater un peu cthistoire d'alignement de données car si je comprends bien tout vient de là.

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par DavG
    En regardant dans la doc du C99, les types suivants sont définis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <stdint.h> 
     
    typedef short int16_t;
    typedef long int32_t;
    Ce qui me confirme dans l'idée qu'on peut assumer qu'un short c'est 16 bits et un long 32 ... à moins que je n'ai manqué quelque chose
    Dans quel doc as tu trouver ca ?

    Personellement le seul truc que j'ai vu dans un draft de la norme c'est ceci :

    5.2.4.2.1 Sizes of integer types <limits.h>

    [#1] The values given below shall be replaced by constant
    expressions suitable for use in #if preprocessing
    directives. Moreover, except for CHAR_BIT and MB_LEN_MAX,
    the following shall be replaced by expressions that have the
    same type as would an expression that is an object of the
    corresponding type converted according to the integer
    promotions. Their implementation-defined values shall be
    equal or greater in magnitude (absolute value) to those
    shown, with the same sign.

    -- number of bits for smallest object that is not a bit-
    field (byte)
    CHAR_BIT 8

    -- minimum value for an object of type signed char
    SCHAR_MIN -127 // -(27-1)

    -- maximum value for an object of type signed char
    SCHAR_MAX +127 // 27-1

    -- maximum value for an object of type unsigned char
    UCHAR_MAX 255 // 28-1

    -- minimum value for an object of type char
    CHAR_MIN see below

    -- maximum value for an object of type char
    CHAR_MAX see below

    -- maximum number of bytes in a multibyte character, for
    any supported locale
    MB_LEN_MAX 1

    -- minimum value for an object of type short int
    SHRT_MIN -32767 // -(215-1)

    -- maximum value for an object of type short int
    SHRT_MAX +32767 // 215-1

    -- maximum value for an object of type unsigned short int
    USHRT_MAX 65535 // 216-1

    -- minimum value for an object of type int
    INT_MIN -32767 // -(215-1)

    -- maximum value for an object of type int
    INT_MAX +32767 // 215-1

    -- maximum value for an object of type unsigned int
    UINT_MAX 65535 // 216-1

    -- minimum value for an object of type long int
    LONG_MIN -2147483647 // -(231-1)

    -- maximum value for an object of type long int
    LONG_MAX +2147483647 // 231-1

    -- maximum value for an object of type unsigned long int
    ULONG_MAX 4294967295 // 232-1

    -- minimum value for an object of type long long int
    LLONG_MIN -9223372036854775807 // -(263-1)

    -- maximum value for an object of type long long int
    LLONG_MAX +9223372036854775807 // 263-1

    -- maximum value for an object of type unsigned long long
    int
    ULLONG_MAX 18446744073709551615 // 264-1
    qui definie les plages minimales garanties

    ainsi qu'un paragraphe sur les types intx_t sans preciser leur correspondance avec les autres types (d'ailleurs il est préciser que ces type intx_t peuvent ne pas exister sur certaines implementations).

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par DavG
    Citation Envoyé par gl
    La taille des short et des long n'est pas plus garantie que celle des int, celle la taille minimale est garantie
    Je viens de l'apprendre : depuis le temps que je programme, je n'ai jamais vu de short autre que 16 bits .... qui utilises ça ???
    Je ne met que des slips!

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par DavG
    En regardant dans la doc du C99, les types suivants sont définis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <stdint.h> 
    typedef short int16_t;
    typedef long int32_t;
    Bzzt! C'est pas la doc C99 que tu as regardé, c'est le fichier de ton implémentation.
    Ce qui me confirme dans l'idée qu'on peut assumer qu'un short c'est 16 bits et un long 32 ... à moins que je n'ai manqué quelque chose
    Sur cette machine, oui.

    Attention, les types fixes de C99 ne sont pas portables. Ils n'existent que sur les machines qui les supportent.

    Par exemple un DSP Motorola TMS320C54 ne sait pas addresser moins de 16 bits. Le type int8_t ne peux donc pas être implémenté (normal, CHAR_BIT vaut 16). Par contre on pourrait trouver un int8_least_t .

  17. #17
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Un petit tour dans le Bétisier ?

    Nas'

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nasky
    Un petit tour dans le Bétisier ?
    Arf! Oui, si tu veux!

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par DavG
    En regardant dans la doc du C99, les types suivants sont définis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <stdint.h> 
    typedef short int16_t;
    typedef long int32_t;
    Bzzt! C'est pas la doc C99 que tu as regardé, c'est le fichier de ton implémentation.
    Non, c'est dans un des liens sur le C99 que tu donnes dans ton site

    En fait, a force de tout lire j'en arrive a la conclusion que ce n'est pas ecrit dans une norme mais que sans doute par convention un short ca fait 16 bits

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [Débutant] utiliser un unsigned char au lieu d'un u. sho
    Citation Envoyé par DavG
    En fait, a force de tout lire j'en arrive a la conclusion que ce n'est pas ecrit dans une norme mais que sans doute par convention un short ca fait 16 bits
    La norme dit clairement que la gamme minimale d'un short est -32767..32767. Tu en déduis ce que tu veux sur la taille d'un short...

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

Discussions similaires

  1. [PIC] Débutant question sur "unsigned char"
    Par lcoulon dans le forum Débuter
    Réponses: 21
    Dernier message: 08/10/2009, 22h43
  2. utiliser un unsigned char **
    Par BatuBou dans le forum C
    Réponses: 3
    Dernier message: 09/01/2008, 14h55
  3. [débutant]obtenir un unsigned char en tant que String
    Par NorthernLights dans le forum C++
    Réponses: 2
    Dernier message: 03/02/2006, 10h30
  4. Réponses: 6
    Dernier message: 06/12/2005, 16h54
  5. [Débutant] Utilisation de FOP - Register Fonts with FOP
    Par Johnbob dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 31/01/2004, 00h27

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