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

 C++ Discussion :

Une division par 0 qui donne 0 !


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Avatar de Captain'Flam
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2011
    Messages
    273
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : F�vrier 2011
    Messages : 273
    Billets dans le blog
    1
    Par d�faut Une division par 0 qui donne 0 !
    Bonjour,
    je compile+ex�cute ce
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    int main ()
        {
        int x = (1/0) - 1  ;
        return x ;
        }
    sous Visual Studio 2017 en Win64, et la valeur affect�e � x est -1 !
    je n'ai pas essay� en 32 bits, ni avec d'autres version de Visual, mais tout de m�me, �a laisse songeur...
    Pour info, avec x = (1/0) ; j'ai bien une erreur div by 0 � la compilation.

    Suis-je le seul dans ce cas ?
    Merci de vos avis/remarques...

  2. #2
    Responsable Syst�mes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Ao�t 2011
    Messages
    18 272
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Gestion de parcs informatique
    Secteur : High Tech - Mat�riel informatique

    Informations forums :
    Inscription : Ao�t 2011
    Messages : 18 272
    Par d�faut
    Capitaine Flam, tu es d'une autre galaxie ....

    Compil� en l'�tat sous gcc :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    test.c: In function ‘main’:
    test.c:3:15: warning: division by zero [-Wdiv-by-zero]
    et � l�ex�cution :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    ./a.out 
    Exception en point flottant
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    VS 2017 semble supprimer l'op�ration.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    mov         dword ptr [x],0FFFFFFFFh
    C'est abusif je trouve, mais �crire ce code est de toutes fa�ons faux et ne devrait jamais �tre fait donc bon.
    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.

  4. #4
    Responsable Syst�mes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Ao�t 2011
    Messages
    18 272
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Gestion de parcs informatique
    Secteur : High Tech - Mat�riel informatique

    Informations forums :
    Inscription : Ao�t 2011
    Messages : 18 272
    Par d�faut
    Il ne fait pas de warning VC 2017 ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Non aucun, m�me avec /Wall.
    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 Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Le compilateur est libre de faire ce qu'il veut lorsque le code est invalide.

    clang ne met pas de valeur de retour et gcc utilise une exception d'opcode invalide (en -O3) ou une exception sur les flottants est lanc� par le mat�riel. https://godbolt.org/z/3kFe0m

    Par contre, mettre simplement int x = 1/0; ne compile pas avec msvc: error C2124: divide or mod by zero.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 840
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par Captain'Flam Voir le message
    sous Visual Studio 2017 en Win64, et la valeur affect�e � x est -1 !

    Suis-je le seul dans ce cas ?
    Merci de vos avis/remarques...
    Bonjour

    Moi aussi, j'ai compil� avec gcc et j'ai comme chrtophe.

    J'ai toutefois une petite question idiote (ne connaissant pas le monde Microsoft/VS). T'es s�r que la sortie est "-1" ? Si par exemple je fais une analogie avec le monde Unix/Linux, la sortie d'un programme donne une valeur comprise entre 0 et 255 (donc modul�e si le programme retourne une valeur d�passant ces limites). Il est donc tout � fait possible qu'il y ait modfication entre ce que sort ton code et la fa�on dont Windows le r�cup�re non ? Moi si j'avais fait cette exp�rimentation, je l'aurais plut�t affich�e dans mon code via un printf("%d\n", x) plut�t que d'envoyer cette valeur � l'OS. Et de fait, c'est ce que j'ai fait en r�alit�.

    Sinon en allant dans l'absolu, t'as tent� de remplacer ton "-1" par un "+1" ? Parce que bon, faire une op�ration ill�gale d�j� c'est chaud pour d�terminer ce qui se passe mais si en plus tu lui rajoutes des contraintes li�es � la soustraction (extension du bit de signe, etc) �a complexifie encore plus ta recherche non ?

    Citation Envoy� par chrtophe Voir le message
    Capitaine Flam, tu es d'une autre galaxie ....
    C'est pas tout � fait exact. La chanson ne dit pas qu'il est d'une autre galaxie, mais dit en r�alit� qu'il n'est pas de la notre. Un peu comme si je concluais que Dumbo est un chat parce que quelqu'un me dit qu'il n'est pas un chien (Sophisme donc).
    Et elle rajoute "mais du fond de la nuit". Donc il est en r�alit� du fond de la nuit...

    Citation Envoy� par Bktero Voir le message
    Si c'est un undefined behavior, tout peut arriver...
    Tu es notre Salomon
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Responsable Syst�mes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Ao�t 2011
    Messages
    18 272
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Gestion de parcs informatique
    Secteur : High Tech - Mat�riel informatique

    Informations forums :
    Inscription : Ao�t 2011
    Messages : 18 272
    Par d�faut
    Le compilateur est libre de faire ce qu'il veut lorsque le code est invalide.
    Ah bon ? Pour moi il ne devrait pas compiler ce code invalide. Pour moi �crire x=(1/0) -1 revient � soustraire 2 constantes dont une est non �valuable, donc invalide. D�j� juste un warning avec gcc c'est gentil je trouve.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  9. #9
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Il y a plusieurs niveaux de code invalide, avec des diff�rences tr�s subtiles entre elles... Plus de d�tail l� : https://en.cppreference.com/w/cpp/language/ub

    En gros, dans ce cas, il serait simple de diagnostiquer la division par 0. Mais dans le cas g�n�ral, ce n'est pas possible. Et donc la norme ne va pas imposer � un compilateur de le faire. Apr�s, ce que fait r�ellement un compilo ou un autre, c'est comme il en a envie (on parle g�n�ralement de QoI, quality of implementation).Et l�, on peut dire qu'on aimerait probablement avoir mieux... Mais comme d'un autre c�t�, c'est artificiel comme exemple, veut-on vraiment que les devs du compilateur passent leur temps l� dessus ?
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  10. #10
    Membre �clair�
    Avatar de Captain'Flam
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2011
    Messages
    273
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : F�vrier 2011
    Messages : 273
    Billets dans le blog
    1
    Par d�faut
    Merci � tous pour vos commentaire avis�s.
    Pour information je ne viens pas de la galaxie ou on calcule des divisions par z�ro pour le plaisir d'�crire du code loufoque

    Parmi mes outils perso de C/C++, j'ai une macro (COMPIL_ASSERT) qui d�pend d'une condition.
    Si la condition est v�rifi�, l'�valuation de la macro donne 0.
    Sinon, elle tombe sur une division par z�ro.

    Si le compilateur l�ve une erreur en cas de division par z�ro (ce que je croyais certain) cette macro permet de tester certaines conditions � la compilation.
    Par exemple, dans un projet multi plateforme (qui doit fonctionner m�me avec des compilateurs ant�diluviens),
    il peut �tre tr�s utile d'ajouter COMPIL_ASSERT( sizeof( void* ) == sizeof( long )) quelque part dans le code.

    Mais depuis que j'ai install� Visual 2017, ces v�rifications de v�rifient plus rien...
    Et j'ai simplifi� cette macro au maximum pour vous soumettre un code aussi simple que possible.

    Depuis, j'ai trouv� une autre astuce : ma macro d�clare un tableau de dimension -1 si la condition n'est pas v�rifi�e.
    Mais je n'ai pas encore test� tous les compilateurs avec lesquels je suis amen� � travailler.

  11. #11
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    D�clarer un tableau de taille -1 est l'impl�mentation que j'ai toujours vu pour ceci.
    Maintenant C++11 a ajout� �a dans le standard static_assert.
    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.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. plantage avec une division par 0
    Par wauant dans le forum Windows Vista
    R�ponses: 2
    Dernier message: 04/07/2006, 08h04
  2. Mise � jour d'une balise par innerHTML qui pose pb !!
    Par nerik38 dans le forum G�n�ral JavaScript
    R�ponses: 2
    Dernier message: 20/01/2006, 16h13
  3. Afficher une fen�tre d'informations qui donne l'impression de se d�t�cher
    Par jean_bobi dans le forum Agents de placement/Fen�tres
    R�ponses: 11
    Dernier message: 25/09/2005, 15h31
  4. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    R�ponses: 7
    Dernier message: 05/11/2004, 17h33
  5. probleme avec une division par z�ro
    Par jcharleszoxi dans le forum Langage SQL
    R�ponses: 2
    Dernier message: 26/03/2003, 18h14

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