Salut à tous,
Ma problématique est très simple : j’essaye actuellement d’entrer la valeur -2147483648 dans un int en héxadécimal. Je précise que ce nombre est la valeur mathématique minimale représentable dans les int sur ma machine (mes int font 4 octets, et les nombres négatifs sont représentés par complément à deux).
Voici donc le code que je propose : int a = -0x80000000;
. Et voilà !
Maintenant viennent 2 questions.
PREMIERE QUESTION
Si je me fie au cours, voici comment se passe la conversion :
- On a une constante hexadécimale, dont la valeur (2147483648) n’est pas représentable dans un int : elle sera représentée dans un unsigned int (voir le cours : "Les opérations mathématiques").
- On a un moins devant cette valeur : on applique le complément à deux : on retombe sur la même valeur.
Voilà donc mon premier problème : on a une conversion de unsigned int vers int, et qui-plus-est d’une valeur non représentable dans un int, vers un int ! Cela me semble très peu "propre", qu’en pensez-vous ? Sur ma machine le code fonctionne mais je me demande si ce n’est pas un "coup de chance"…
SECONDE QUESTION
J’ai donc voulu savoir si le cas que j’étudie était couvert par la norme. Page 68 (du pdf) du draft de la norme proposé par le cours, je lis :
6.3.1.3 Signed and unsigned integers 1 When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged. 2 Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.60) 3 Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.
Et cela me fait un peu peur, car il semble que nous soyons dans le troisième cas : comportement indéfini ? Il serait donc en théorie impossible de faire mon affectation en hexadécimal ? Je n’ose croire ce que je déduis… Me trompe-je ? Je vous serais très reconnaissant de m’éclairer un peu
Bonne soirée à tous