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

Langage C++ Discussion :

reintepret_cast <unsigned int> (float)


Sujet :

Langage C++

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut reintepret_cast <unsigned int> (float)
    Bonjour,

    Prenons ce bout de code dont le but est d'afficher les bits d'un flottant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
    	float value = 1.0f;
    	auto integer = reinterpret_cast<std::uint32_t&>(value);
    	std::cout << std::bitset<32>(integer) << std::endl;
    }
    Pourquoi est-il nécessaire de mettre un & dans le cast, sous peine d'obtenir l'erreur suivante ?
    error: invalid cast from type 'float' to type 'uint32_t {aka unsigned int}'
    Question secondaire : est-ce que ma technique d'affichage des bits est correcte ? Y a t-il mieux ?

    Merci d'avance !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    je ne saurais dire pourquoi, mais généralement pour effectuer une conversion avec reinterpret_cast vaut mieux utiliser des pointeurs que je trouve plus clairs auto i = *reinterpret_cast<uint32_t*>(&monfloat);.
    Mais si je veux afficher les bits d'un truc, j'utiliserai plutôt un code de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define GETBIT(o, b) (o & (1<<(b)) ? 1 : 0)
    std::cout<<"0b";
    for (int i = 0; i < sizeof(monfloat) * 8; ++i)
       std::cout<<GETBIT(monfloat, i);
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,

    TL; DR: les deux versions du cast sont illégales. Mais dans le second cas, il s'agit d'UB "no diagnostic required".

    Cast d'un float en entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reinterpret_cast<std::uint32_t>(value);
    Dans ce cas, il s'agit d'une mauvaise utilisation de reinterpret_cast :

    [expr.reinterpret.cast]/1

    Conversions that can be performed explicitly using reinterpret_cast are listed below.
    No other conversion can be performed explicitly using reinterpret_cast.
    Les points [expr.reinterpret.cast]/2 à [expr.reinterpret.cast]/11 listent exhaustivement les usages possibles de reinterpret_cast, et float vers entier n'en fait pas parti.

    Cast d'une référence vers un float en référence vers un entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reinterpret_cast<std::uint32_t&>(value);
    Dans ce cas, il s'agit d'une violation de la strict aliasing rule :

    [basic.lval]/11

    If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined
    Les points [basic.lval]/11.1 à [basic.lval]/11.8 listent exhaustivement les cas possibles, et l'interprétation d'un type float par un type entier n'en fait pas parti.

    Pourquoi dans le second cas ça marche alors ?
    C'est ce qu'il y a de plus diabolique avec l'undefined behavior.

    [defns.undefined]
    undefined behavior

    behavior for which this document imposes no requirements
    Dans un tel cas, tout peut arriver : il s'agit d'une construction erronée ou non portable d'un programme pour lequel le standard n'impose aucune restriction (notamment, la compilation peut réussir) pour l'implémentation (le compilateur). Le résultat peut varier : la situation peut être complètement ignorée, le programme peut avoir un comportement inatendu ou aléatoire, vous pourriez même voir des démons sortir de vos trous de nez !

    La conclusion est laissée au soin du lecteur.
    -- Yankel Scialom

  4. #4
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Du coup, comment faire ?

    Afin de construire un bitset à partir d'un flotant, et cela d'une manière portable et bien définie, il vous faut :

    1. vous assurer de travailler avec des types compatibles ;
    2. copier la représentation de votre flotant dans un type entier compatible ;
    3. construire le bitset à partir de cet entier.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <bitset>
    #include <cstring>
    #include <iostream>
     
    int main()
    {
        float f = -1./0.;
        static_assert(sizeof(float) <= sizeof(long long unsigned int), "wrong sizes"); // 1.
        long long unsigned int f_as_int = 0;
        std::memcpy(&f_as_int, &f, sizeof(float)); // 2.
        std::bitset<8*sizeof(float)> f_as_bitset{f_as_int}; // 3.
     
        std::cout << f_as_bitset.to_string() << "\n";
    }.
    Affiche 11111111100000000000000000000000. Live démo : http://coliru.stacked-crooked.com/a/b5309c227a823f1d
    -- Yankel Scialom

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu as aussi cet article qui traite de sérialisation de float avec l'astuce de l'union et pourrait t'être utile.
    D'autres informations encore ici https://jeux.developpez.com/tutoriel...ule-flottante/
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Tu as aussi cet article qui traite de sérialisation de float avec l'astuce de l'union et pourrait t'être utile.
    Attention, le "truc avec l'union" est aussi UB.
    -- Yankel Scialom

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Par contre, dans mon souvenir, le cast en unsigned char* est valide.
    La taille de l'ensemble à parcourir est sizeof(T).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
    	float value = 1.0f;
    	auto p = reinterpret_cast<unsigned char*>(&value);
    	for (std::size_t i = 0; i < sizeof(value); ++i) std::cout << *p;
    	std::cout << std::endl;
    }
    On parle d'aliasing de types.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par ternel Voir le message
    Par contre, dans mon souvenir, le cast en unsigned char* est valide.
    Tout à fait ! Mais il n'est ensuite pas possible de construire un bitset.
    -- Yankel Scialom

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Attention, le "truc avec l'union" est aussi UB.
    Oui et tout est précisé dans l'article, ça marche pour tous les compilateurs qu'il a utilisé. Ca marche aussi pour tous les compilateurs que j'ai utilisé.
    Vous pouvez aussi y parvenir via un uint32_t*, mais d'expérience ça ne passe pas avec GCC -O2, donc je préfère la technique de l'union à la place. Des amis ont aussi fait remarquer (à juste titre) que le seul moyen absolument standard d'avoir le flottant comme entier est de convertir un pointeur vers le flottant en uint8_t* et reconstruire la valeur entière depuis les valeurs des quatre octets accédés individuellement via un pointeur d'octet. Ça semble une manière un peu absurde de le faire selon moi. Mesdames et messieurs… C++ !

    En attendant, ces cinq dernières années, je n'ai eu aucun problème avec la technique de l'union.
    Un UB n'est pas un truc magique qui ne marche pas ou à fuir comme la peste. Un moment faut écrire du code que le compilateur comprend, parce que le code est de toutes façons rarement/jamais portés sur énormément de compilos mais sur un ensemble fini et connus.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    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 519
    Points
    41 519
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Attention, le "truc avec l'union" est aussi UB.
    Je suis surpris que le memcpy() ne le soit pas.
    Pour faire ça bien, j'utiliserais les unsigned char pour construire l'entier.

    A-t-on, depuis le temps, des macros standard pour l'endianness, ou faut-il la tester en runtime (là encore, avec la méthode du unsigned char)?
    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.

  11. #11
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Je suis surpris que le memcpy() ne le soit pas.
    Non c'est tout bon !

    -t-on, depuis le temps, des macros standard pour l'endianness, ou faut-il la tester en runtime (là encore, avec la méthode du unsigned char)?
    Des solutions arrivent avec C++20
    -- Yankel Scialom

  12. #12
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Un UB n'est pas un truc magique qui ne marche pas ou à fuir comme la peste. Un moment faut écrire du code que le compilateur comprend, parce que le code est de toutes façons rarement/jamais portés sur énormément de compilos mais sur un ensemble fini et connus.
    J'ai déjà perdu tellement de temps dans ma vie avec des UB, notamment suite à du portage de code d'un compilo à sa version suivante ... ou comment un apt update peut casser votre programme. J'ai déjà perdu suffisamment de temps pour toute une vie, si je peux éviter l'UB en écrivant une ligne de plus, je le fais.
    -- Yankel Scialom

  13. #13
    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 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Un UB n'est pas un truc magique qui ne marche pas ou à fuir comme la peste. Un moment faut écrire du code que le compilateur comprend, parce que le code est de toutes façons rarement/jamais portés sur énormément de compilos mais sur un ensemble fini et connus.
    Le problème c'est que de nos jours, quand le compilo détecte un UB, il décide que ça n'arrivera jamais et optimise comme un porc en conséquence. Ce qui veut dire que plus un compilo est récent, plus le UB est dangereux.

    J'avais lu un exemple où quelqu'un avait joué avec les casts pour avoir des références potentiellement nulles (ce qui est un UB) et avait mis un test de nullité dans une fonction: void myfunc(int &x) { if(&x!=NULL) { x=42; } }Le compilo a décidé qu'une référence nulle étant un UB, ça n'arrivait jamais donc le test était inutile...
    Moralité: Les compilos de nos jours sont optimisés pour te renvoyer les UB dans la gueule, donc ne fais pas de UB...

    Et au passage, garde à l'esprit que les entiers signés ont beaucoup plus de UB que les non-signés.
    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.

  14. #14
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Sur un des processeurs que j'utilise, les exemples cités qui fonctionnent sont ceux de Bktero et de ternel. Les union fonctionnent aussi.
    Un indice, vues les capacités du MSP320 on a forcément sizeof(char)==sizeof(int).

  15. #15
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Sur un des processeurs que j'utilise, les exemples cités qui fonctionnent sont ceux de Bktero et de ternel. Les union fonctionnent aussi.
    Un indice, vues les capacités du MSP320 on a forcément sizeof(char)==sizeof(int).
    Tu es peut-être dans cette situation, mais tu devrais faire comme si ce n'était pas le cas, car la norme précise bien que sizeof(char) <= sizeof(short) <= sizeof(int)...

    Partir sur une hypothèse différente -- fut-elle vérifiée aujourd'hui sur ton processeur actuel, avec ton compilateur actuel -- t'expose à des problèmes sans noms lorsque tu passeras à "la version suivante" du processeur ou du compilateur.

    Et il suffit de "pas grand chose" pour que cela arrive: tôt ou tard, il y aura rupture de stock (ne serait-ce que parce que la machine qui le construit sera tombée en panne) du processeur que tu utilises, et ton fournisseur t'enverra la version suivante (il te préviendra sans doute, du moins, on peut l'espérer ) !
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #16
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Mon compilateur est tout à fait conforme à la norme sizeof(char)<=sizeof(short)<=sizeof(int) et un int doit pouvoir stocker [-32767,+32767]. Il n'y a aucun problème particulier si on n'oublie pas qu'un byte peut tout à fait faire 2 octets, le MSP320 ne peut accéder qu'à 65536 mots donc on a aussi sizeof(void*)==sizeof(char) et sizeof(long)==sizeof(float)==2.

  17. #17
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Je n'ai jamais voulu dire que le compilateur que tu utilisais n'était pas conforme à la norme, car, à partir du moment où l'opérateur de comparaison est <= et non simplement <, il va de soi que l'on peut se trouver dans une situation dans laquelle sizeof(char) == sizeof(short) et sizeof(short) == sizeof(int) (et, partant, du fait de la transitivité de l'égalité, dans laquelle sizeof(char) == sizeof(int) ).

    Seulement, c'est une situation tout à fait particulière due à une configuration matérielle donnée qui est loin d'être vérifiée de manière systématique.

    Et donc, si tu pars du principe que se sera systématique, tu te mets de facto dans une faiblesse par rapport à n'importe quelle décision de "faire autrement" qui pourrait être prise, car tout ce qui sera basé sur cette assertion deviendra forcément caduque.

    Et, comme tu n'as -- a priori -- aucun droit de regard sur ce genre de décision, tu cours le risque qu'elle soit prise... à peu près n'importe quand. Mais tu peux avoir la certitude que ce sera toujours... au plus mauvais moment pour toi
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #18
    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 519
    Points
    41 519
    Par défaut
    Tant qu'on parle de l'adhérence stricte à ce genre de standards, là où ça fait mal, c'est qu'apparemment il a fallu attendre plusieurs normes avant d'avoir la garantie que INT_MIN <= -INT_MAX (et donc, la garantie que -INT_MAX est une valeur valide).
    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.

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

Discussions similaires

  1. unsigned int dans un vector
    Par Mindiell dans le forum SL & STL
    Réponses: 6
    Dernier message: 12/09/2007, 11h07
  2. Réponses: 1
    Dernier message: 15/02/2007, 17h32
  3. int, unsigned int, et la fonction pow
    Par salseropom dans le forum C
    Réponses: 11
    Dernier message: 22/12/2006, 17h53
  4. [WMI] Variant de type Unsigned Int 64 ...
    Par phplive dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/05/2006, 20h15
  5. conversion int to float ->resultat erroné
    Par firejocker dans le forum MFC
    Réponses: 5
    Dernier message: 03/04/2006, 14h41

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