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
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.
Citation:
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.
Citation:
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;
Re: Merci de la précision
Citation:
Envoyé par TutuXoZaure
Code:
1 2
| signed short int test = 10;
test = ~test++; /* Donc -10 */ |
C'est presque ça ;)
Citation:
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).
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 :twisted:) 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
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:
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.
Citation:
Je viens de finir mon avatar (un tux satanique > m'enfin le TutuXoZaure quoi :twisted:) 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