cette condition est-elle suffisante pour le contrôle de débordement dans la multiplication

int isOverflow(uint a, uint b) { // a and b are unsigned non-zero integers. uint c = a * b; if (c  b ? a : b)) return 1; else return 0; } 

Est-ce que je manque quelque chose? Je pense que l’extrait ci-dessus fonctionnera.

EDIT : J’ai vu d’autres solutions comme la multiplication de grands nombres, comment attraper le débordement qui utilise des méthodes sophistiquées pour le vérifier. Mais pour moi, la solution simple ci-dessus semble également correcte. C’est pourquoi je pose cette question.

    Il est facile de prouver que c’est faux en trouvant une exception:

    Considérez ces deux valeurs non signées sur 8 bits: a = 0x1F et b = 0xF .

     c = a * b c = 0x1F * 0xF c = 0xD1 (Overflow! The real answer is 0x1D1) c < ( a > b ? a : b) 0xD1 < 0x1F => False (Wrong!) 

    Une réponse correcte est ici .

    CERT a un excellent document INT30-C. Assurez-vous que les opérations sur les entiers non signés ne recouvrent pas tous les cas de dépassement d’entier non signé et vérifiez qu’elles préconisent des multiplications , vous devez tester avant d’effectuer la multiplication pour éviter le dépassement avant qu’il ne survienne ( j’ai modifié l’exemple pour l’adapter à vos questions ):

     if (a > SIZE_MAX / b) { /* Handle error condition */ } c = a * b; 

    Il s’agit d’une solution simple à votre problème, elle a été résolue et vous devez utiliser les solutions qui ont fait leurs preuves, proposer vos propres solutions peut être sujet à des erreurs.