C - conversion

cdebutant -  
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai acheté le livre "Le langage C" des créateurs du C, Kernighan et Ritchie.

Je ne comprends pas tout. Je me demandais si vous pouviez m'expliquer certaines choses, sachant que je ne suis pas fort en programmation :-(

J'ai l'impression qu'il faut être très attentif aux types des variables.

P.44 : "Les règles de conversion se compliquent dans le cas d'opérandes unsigned. Le problème est que les comparaisons entre des valeurs signées et non signées dépendent de la machine, parce qu'elles dépendent des tailles des divers types entiers. Par exemple, en supposant qu'un int soit représenté sur 16 bits et un long sur 32 bits, -1L<-1U, car 1U, qui est un int, est promu en un signed long. Mais -1L>-1UL, car -1L est promu en unsigned long, et prend donc l'apparence d'un nombre positif très grand."

:'( Je n'y comprends rien. Pouvez-vous m'expliquer ce passage ?

Ce que j'ai compris c'est que signed et unsigned étaient deux qualificatifs servant pour int et char. Je crois aussi qu'on peut ajouter des suffixes aux nombres pour bien indiquer de quels types ils sont. Par exemple : si l'on veut faire de -2 un long, on peut écrire -2L. C'est cela ?

Comment les valeurs peuvent-elles changer de la sorte ?!

Merci par avance.

3 réponses

cdebutant
 
Il y a un autre passage du même genre que je ne comprends pas. J'ai oublié de le mettre dans le précédent message

p.43 : "La conversion des caractères en entiers présente une certaine subtilité. Le langage ne dit pas si les variables de type char sont des quantités signées ou non. La conversion d'un char en un int peut-elle donner un entier négatif ? La réponse dépend de l'architecture de la machine utilisée. Sur certaines machines, un char dont le bit de poids fort est à 1 donnera un entier négatif (c'est le principe d'"extension de signe"). Sur d'autres, la conversion s'effectue en ajoutant des zéros à gauche du char, ce qui donne toujours un int positif."

Ce que je ne comprends pas c'est qu'un unsigned char vaut entre 0 et 255 et un signed char entre -128 et 127. Donc pourquoi la conversion d'un char égal à 12 ne donne pas un entier égal à 12 ? Ca a un lien avec ces histoires d'octets ?

Merci à la personne qui me répondra (c'est pour le boulot que je lis ce bouquin et non pour mon plaisir personnel)
0
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
 
je vais essayer de répondre surtout à ton deuxième message, car je ne pense pas avoir le temps et les connaissances techniques suffisantes pour ne pas me tromper sur la première partie.

Concernant les caracteres ASCII donc par exemple.

ok, la valeur 12 sera donc en 12 en char. Mais attention. Il y a des caractères dont le code dépasse 127. le caractère avec le code 128 risque d'être représenté en c par la valeur "-127", le code 129 par "-126", etc... C'est au niveau des négatifs / valeurs qui dépassent le maximum signé que, en effet, il y a une histoire d'octets. En "complément à 2", sauf erreur -1 (en signed char 4 octets)= 1111 (en binaire) = 255 (en unsigned char 4 octets)


Au passage : il est possible que char soit plus que 4 octets. (bien que en pratique, sur les PC, il faut effectivement 4). La norme ne prévoit que le fait que ça doit être le plus petit type numérique.
0
cdebutant
 
Bonjour Pacorabanix et merci de ta réponse.

-1 (en signed char 4 octets)= 1111 (en binaire) = 255 (en unsigned char 4 octets)

Donc si un type n'est pas prévu pour coder des négatifs (comme unsigned char) la conversion en ce type d'un négatif ne donne rien de bon, c'est cela ? Ainsi -1 devient 255, car 255 est juste avant 0 (grosso modo).

Ai-je bien compris ?

Pour le premier message et sur ces histoires d'octets, je suis encore preneur de toute information ^^

Merci beaucoup
0
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
 
Oui, tu as bien compris, mais attention, cette représentation des négatifs binaires "en complément à 2" est celle il me semble le plus couramment utilisée, mais encore une fois rien ne garanti que 1111 est interprété comme -1 ! Ceci aussi dépend de la machine. Donc à prendre comme un exemple (véridique)
0
cdebutant
 
Ce qui est curieux c'est que le passage de la page 44 parle d'une conversion de int en long. Or long est plus grand que int, donc je ne vois pas où serait le problème.
0
Mahmah Messages postés 497 Statut Membre 125
 
Salutations,

>>Or long est plus grand que int
Tu es chez AGF ?

C++

La définition officielle est
2 <= sizeof(int) <= sizeof( long )

Donc dépendante des systèmes d'exploitation.

M.
0