Débordement d’entier avec soustraction

Bon, je dois donc implémenter une méthode qui renvoie zéro ou un selon que xy entraîne un débordement.

Example: subTract(0x80000000,0x80000000) = 1, subTract(0x80000000,0x70000000) = 0, 

Je ne cherche pas une implémentation de cette méthode. Je ne comprends pas lequel est supposé causer un débordement, et cela rend le démarrage presque impossible. Pourquoi l’un d’eux cause-t-il un débordement? Ce qui définit un débordement avec soustraction.

supposons que le système utilise le complément à 2 et une représentation des bits sur 32 bits

Essayez d’effectuer la soustraction avec 32 bits et 64 bits.

1: Pas de débordement. La différence de xx est 0 et est représentable en tant qu’int 32 bits. Ceci est prévu indépendamment de la valeur entière / type x .

0: débordement. La différence entre xy (ou -2147483648 - 1879048192 ) est arithmétiquement -4026531840 et n’est pas représentable sous la forme d’un int 32 bits. Le résultat du code ci-dessous fournit une différence de 268435456 . Mais int overflow étant un comportement indéfini, le résultat peut différer ici sur une autre machine.

Un débordement avec soustraction se produit lorsque la différence arithmétiquement correcte ne correspond pas à la différence calculée.

 void subtest(void) { int32_t x = 0x80000000; int32_t y = 0x70000000; printf("x = %" PRId32 "\n", x); printf("y = %" PRId32 "\n", y); printf("xx = %" PRId32 "\n", xx); printf("xy = %" PRId32 "\n\n", xy); int64_t x2 = x; int64_t y2 = y; printf("x2 = %" PRId64 "\n", x2); printf("y2 = %" PRId64 "\n", y2); printf("x2-x2 = %" PRId64 "\n", x2-x2); printf("x2-y2 = %" PRId64 "\n", x2-y2); } x = -2147483648 y = 1879048192 xx = 0 xy = 268435456 x2 = -2147483648 y2 = 1879048192 x2-x2 = 0 x2-y2 = -4026531840