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 :

petite question d'un curieux, débutant en C ...


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut petite question d'un curieux, débutant en C ...
    Bonjour à tous,

    Voila je me pose une petite question peut etre bête mais bon...

    Je précise que je suis un pur débutant en C

    Quel est la taille en bit d'une variable de type short int ?

    Parce que quand je fais cela, ca me donne 16 bits :

    short int maVar = 1;
    short int result = sizeof maVar * 8;
    printf("%d\n",result) /* Donc resultat = 16 .. */

    Bizzarement pourtant, avec ce code :

    short int maVar = 1;
    maVar <<= 16;
    printf("%d\n",maVar) /* >> Résultat = 0 (donc pb) */

    Pourtant je devrais obtenir 65535 (2*16).... Mais apparemment je ne peut aller que jusqu'à 14 décalage vers la gauche...

    Avec 15 ça passe, mais j'obtiens -32768 (pourquoi le moins ??)

    Alors certe je suis pas vraiment un matheu (et je viens tout juste de comprendre la notation binaire : ptet de la que viens le pb d'ailleurs ; ).. mais je vois pas pourquoi je peux pas faire tenir un entier sur 16 bits.

    Si qq peut éclairer ma lanterne, ça serait avec plaisir ; )

    TutuXoZaure

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    1) 2^16 = 65536, pas 65535
    2) Le type short de base est signé : un entier 16-bits signé va de -32768 à +32767 (le type non-signé va de 0 à 65535
    3) tu décales de 16 au lieu de 15, là : quel que soit le nombre avant décalage, ton short int vaut zéro après (puisque tu sors complètement le nombre)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    bonjour,

    regarde du coté de unsigned et signed.

    >> short int maVar = 1;
    >> maVar <<= 16;
    >> printf("%d\n",maVar) /* >> Résultat = 0 (donc pb) */

    non aucun problème, dépassement de capacité, troncage !

    bienvenue en C.

  4. #4
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 332
    Points : 130 089
    Points
    130 089
    Billets dans le blog
    1
    Par défaut Re: petite question d'un curieux, débutant en C ...
    Citation Envoyé par TutuXoZaure
    Quel est la taille en bit d'une variable de type short int ?
    Il faut savoir que ça dépend de la plate-forme utilisée. C'est *souvent* 16 bits effectivement, mais il ne faudrait faire aucune supposition là-dessus.

    short int maVar = 1;
    maVar <<= 16;
    printf("%d\n",maVar) /* >> Résultat = 0 (donc pb) */

    Pourtant je devrais obtenir 65535 (2*16)....
    Non, 2 * 16 = 65 536, et il faut... 17 bits pour stocker ce nombre ! Un "1" suivi de 16 "0". Comme le nombre est trop grand, il est tronqué, on ne prend que les 16 bits de poids inférieur... donc on ne prend que les 0, c'est pourquoi tu obtiens 0.

    Avec 15 ça passe, mais j'obtiens -32768 (pourquoi le moins ??)
    Parce que une variable "int", par défaut est signée. Cela veut dire que le bit de poids fort est un bit de signe. Bit 15 = 0 : positif, Bit 15 = 1 : négatif. Attention, la représentation d'un négatif est un peu plus complexe que ça (c'est en fait un complément à 2 du nombre positif correspondant).

    Ton nombre est constitué de 15 "0" (bits de 0 à 14), et le Bit 15 est à "1", ce qui fait que le résultat est négatif.

    Tu peux cependant décider de travailler en non signé. Pour ça, tu déclares ta variable avec unsigned :

    unsigned short int i;
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Merci ...
    Et bien on peut dire que vous êtes très rapide...

    Merci à vous tous pour vos réponses.

    Alors effectivemment je fais un bel ignorant ; )

    Bon pour ma défense, pendant que vous me répondiez, je me suis effectivemment rendu compte que l'on ne pouvait faire que 15 décalage avec un short int (mais je ne savais pas qu'il fallait un type unsigned), et je me posais aussi la question de la représentation d'un nb négatif en binaire ... et bah voila : )

    Donc si j'ai bien compris :

    En type signed short int on travaille sur 15 bit plus un bit pour le signe (+/-) à gauche et en unsigned sur les 16, mais comme 2 puissance 16 = 65536 et non pas 65535 (chui vraiment une quiche, pourtant je me suis concentré avant de posté ; ) et bah ca dépasse des 16 bits et y a tronquage .. ?

    En tout cas merci pour votre réactivité, avec en plus une chtite réponse de l'admin ca fait toujours plaisir ; )

    TutuXoZaure

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    En tout cas je suis en train de parcourir le forum la, et je crois que je suis bien tombé ici pour un apprentissage productif ; )

    jsuis bien refait....

  7. #7
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 332
    Points : 130 089
    Points
    130 089
    Billets dans le blog
    1
    Par défaut Re: Merci ...
    Citation Envoyé par TutuXoZaure
    et je me posais aussi la question de la représentation d'un nb négatif en binaire ... et bah voila : )
    Pour être plus précis, un négatif en binaire s'exprime en faisant le complément à 2 du nombre positif correspondant.

    Par exemple, représenter -2 en binaire (sur 8 bits, mais le principe est le même) :
    - On prend 2 : c'est 00000010
    - On inverse tous les bits : 11111101
    - On ajoute 1 : on obtient 11111110

    11111110 c'est -2 en binaire.

    Ca peut paraître absurde au premier abord, mais ça permet de pouvoir ajouter deux nombres binaires sans devoir gérer de cas particulier pour les nombres négatifs.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Merci de la précision
    Ok ok donc si je veux passer un entier positif en négatif (au niveau binaire sinon ça à pas un grand intérêt je le concède ; ), puis-je utiliser ce code ou il y a plus élégant ?

    signed short int test = 10;
    test = ~test++; /* Donc -10 */

    Heu juste au passage, existe-il alors un type "super" short ; ) sur 8 bits ? Enfin t'es pas obligé de répondre, c'est vraiment par curiosité ..

    Merci en tout cas pour ton complément de réponse

  9. #9
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 332
    Points : 130 089
    Points
    130 089
    Billets dans le blog
    1
    Par défaut Re: Merci de la précision
    Citation Envoyé par TutuXoZaure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    signed short int test = 10;
    test = ~test++;  /* Donc -10 */
    C'est presque ça
    Heu juste au passage, existe-il alors un type "super" short ; ) sur 8 bits ?
    Oui : le type char. Il est utilisé habituellement pour stocker un caractère, mais ce n'est qu'un type numérique (le plus petit type numérique manipulable par le micro-processeur en passant).
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Je veux mettre mon avatar ... sniffff
    Effectivemment le type char me retourne bien 8 bits, merci pour l'info (par contre l'incrémentation n'est pas équivalente à une addition de 1 ??)

    Je viens de finir mon avatar (un tux satanique > m'enfin le TutuXoZaure quoi ) mais je ne vois pas ou l'uploader ... peux-tu m'indiquer ou se fait l'opération (j'ai regardé dans profil mais pas trouvé)...

    Thx

  11. #11
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 332
    Points : 130 089
    Points
    130 089
    Billets dans le blog
    1
    Par défaut Re: Je veux mettre mon avatar ... sniffff
    Citation Envoyé par TutuXoZaure
    par contre l'incrémentation n'est pas équivalente à une addition de 1 ??
    Hé ben non . a++ n'est pas équivalent à a + 1, mais (à peu près) équivalent à a = a + 1 (ou a += 1), ce qui est très différent, car ça a un effet de bord sur a.

    Ton opération demande d'incrémenter la variable "test"... mais en même temps, tu lui assignes une autre valeur (~test). Le compilateur ne sait pas dans quel ordre il devra procéder : incrémenter d'abord, assigner ensuite, ou vice-versa. Ce comportement est donc indéterminé, le résultat est indéterminé, et tout bon compilateur le signalera, comme par exemple gcc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test.c:7: attention : operation on `test' may be undefined
    Attention donc en utilisant les opérations d'auto-incrémentation dans les expressions ! Dans le doute, mieux vaut les utiliser uniquement seules.

    Je viens de finir mon avatar (un tux satanique > m'enfin le TutuXoZaure quoi ) mais je ne vois pas ou l'uploader ... peux-tu m'indiquer ou se fait l'opération (j'ai regardé dans profil mais pas trouvé)...
    C'est hors sujet, mais tu ne pourras mettre un avatar que quand tu seras membre du club (100 messages).

    http://www.developpez.net/forums/viewtopic.php?t=227570
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

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

Discussions similaires

  1. petite question de compilation pour débutant
    Par flamant dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 21/09/2007, 15h19
  2. Petite question d'un débutant en C++
    Par faboulous dans le forum C++
    Réponses: 6
    Dernier message: 04/08/2006, 15h43
  3. [débutant] petite question
    Par IDE dans le forum Access
    Réponses: 3
    Dernier message: 01/07/2006, 17h39
  4. Petites questions en vrac d'un débutant.
    Par kriskikout dans le forum Langage
    Réponses: 6
    Dernier message: 08/06/2006, 14h54
  5. Petites questions de débutant
    Par mickael.be dans le forum Débuter
    Réponses: 15
    Dernier message: 28/12/2005, 17h06

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