Rechercher : dans
Par :

C - conversion

Dernière réponse le 13 mar 2008 à 10:48:58 cdebutant, le 11 mar 2008 à 13:34:27 
 Signaler ce message aux modérateurs

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.

Configuration: Windows Vista
Firefox 2.0.0.12

Meilleures réponses pour « C conversion » dans :
[mythes] 1 Kilo-octet = 1024 octets VoirMythe 1 ko = 1 kilo-octet = 1024 octets Réalité FAUX Explications Aux débuts de l'informatique, on travaillait très bas niveau (langage proche du microprocesseur). Or ce dernier travaillant avec des bits (base 2), toutes les unités de stockage...
Linux - Ubuntu - Convertir un DVD en DivX (avec HandBrake) VoirHandBrake est un bon logiciel pour convertir des vidéos, par exemple des DVD en DivX. Voici comment procéder sous Ubuntu: Ajouter les dépôts pour Handbrake sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 62D38753 sudo bash -c 'echo...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

cdebutant, le 11 mar 2008 à 14:36:36

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)

Répondre à cdebutant

2

Pacorabanix, le 11 mar 2008 à 14:44:54

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.

Répondre à Pacorabanix

3

cdebutant, le 11 mar 2008 à 14:58:24

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

Répondre à cdebutant

6

 Pacorabanix, le 13 mar 2008 à 10:48:58

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)

Répondre à Pacorabanix

4

cdebutant, le 12 mar 2008 à 19:41:51

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.

Répondre à cdebutant

5

Mahmah, le 12 mar 2008 à 21:20:17

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.

Répondre à Mahmah