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