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 :

un octet ne fait pas forcément 8 bits ?


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Points : 234
    Points
    234
    Par défaut un octet ne fait pas forcément 8 bits ?
    Bonjour,

    J'aimerais savoir pourquoi:

    1) un octet ne ferait pas forcément 8 bits (j'ai trouvé cela dans un forum quelque part sur le net), et dans quel cas on peut rencontrer ce genre de chose

    2) (conséquence du 1)? ) pourquoi il y a des développeurs qui écrivent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char *c = (char *)malloc(2 * sizeof(char));
    et non pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char *c = (char *)malloc(2);
    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Si, un octet contient toujours 8 bits, d'où la racine "oct"

    C'est le byte qui ne fait parfois pas 8 bits.

    D'où le fait que octet et byte sont souvent synonymes, mais pas toujours.

    Pour le reste, je te renvoi vers la FAQ
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    À ma connaissance, sizeof(char) vaut toujours 1.
    EDIT: c'est effectivement toujours 1, voir le point 6.5.3.4, paragraphe 3 de la norme C99.
    Cf: http://www.open-std.org/JTC1/SC22/WG14/www/standards

    When sizeof is applied to an operand that has type char, unsigned char, or
    signed char, (or a qualified version thereof) the result is 1.
    Pour tes exemples, les deux font la même chose, la différence est sémantique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *c = (char *)malloc(2 * sizeof(char));
    On voit directement dans le malloc qu'on alloue 2 éléments de taille caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *c = (char *)malloc(2);
    On voit qu'on alloue 2 octets, mais est-ce 2 éléments d'un octet chacun, ou un élément de 2 octets ?

    Jette un coup d'oeil ici:
    http://ymettier.free.fr/articles_lma...70/lmag70.html
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Un octet fait forcement huit bits.

    Un byte ne fait pas forcement huit bits.

    char a pour taille 1 byte.

    sizeof retourne un nombre de bytes.

    Utiliser * sizeof(char) permet d'etre un peut plus explicite mais n'a aucun effet pratique.

    Un malloc idiomatique en C, c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *c = malloc(2 * sizeof *c);
    Sans cast et sans repetition du type. (Meme si personnellement je prefere le cast, ce n'est pas idiomatique).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Perso, je ne caste pas non plus la valeur renvoyée par malloc. C'est du void *, et ça se caste implicitement sur n'importe quel type de pointeur.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Utiliser * sizeof(char) permet d'etre un peut plus explicite mais n'a aucun effet pratique.
    C'est sémantique, cela isole le type du nombre d'élément. Du coup tu as moins de risque d'erreur si tu veux changer l'un ou l'autre. De même, pour les chaînes de caractères, on a tendance à mettre + 1 dans le nombre de caractères à allouer, pour montrer qu'on a pensé à allouer de la place pour le caractère de fin de chaîne.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par liberforce Voir le message
    C'est sémantique, cela isole le type du nombre d'élément. Du coup tu as moins de risque d'erreur si tu veux changer l'un ou l'autre.
    Moins de risque par rapport a la methode que je preconise? Ca demande des arguments.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Moins de risque par rapport a la méthode que je preconise? Ca demande des arguments.
    Moins de risque que malloc(2);

    Si la méthode que tu préconises c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *c = malloc(2 * sizeof *c);
    alors non, ce n'est pas plus sûr (vu que ton exemple s'adapte au changement de type de la variable), mais je trouve malloc(2 * sizeof (char)) un peu plus lisible. Question de goûts.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Si la méthode que tu préconises c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *c = malloc(2 * sizeof *c);
    C'est celle que je qualifie d'idiomatique, autrement dit qui me semble la courante en C.

    alors non, ce n'est pas plus sûr (vu que ton exemple s'adapte au changement de type de la variable), mais je trouve malloc(2 * sizeof (char)) un peu plus lisible
    Un moins sur
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. Scroll comboBox ne fait pas défiler les ItemData !
    Par Tchupacabra dans le forum IHM
    Réponses: 4
    Dernier message: 09/12/2005, 09h13
  2. Int 21H AX=716Ch ne fait pas mon affaire !!
    Par TheBigMac dans le forum Assembleur
    Réponses: 4
    Dernier message: 10/09/2004, 20h51
  3. Pb de selection qui ne se fait pas
    Par Stef.proxi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2004, 10h54
  4. [SQL Server 8] le join ne se fait pas
    Par Baquardie dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/07/2004, 14h57

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