Maison >développement back-end >C++ >Pourquoi mon ajout de grande précision C a-t-il une propagation de portage incorrecte ?
Dans votre classe C de grande précision, vous rencontrez un problème où l'ajout de 0xffffffff et 0x04 donne 0xffff0003 au lieu du 0x0100000003 attendu. Ce problème est dû à une propagation de report incorrecte.
Pour comprendre le problème, examinons la situation de débordement lors de l'ajout de grands nombres. Lorsque deux octets non signés (ou un court-circuit non signé dans votre code) sont ajoutés et que le résultat dépasse la valeur maximale (255), l'indicateur de report est défini sur 1. Ce report doit se propager à l'octet suivant, indiquant que le résultat doit être incrémenté de 1.
Dans votre code, vous définissez correctement l'indicateur de report lorsque la somme de deux octets déborde (255). Cependant, les lignes suivantes ne propagent pas correctement le report. Voici le code problématique :
if (i < lhs.nbytes) { if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1); ret.data[i].data += ret.data[i + 1].carry; }
Problème 1 :
L'instruction incrément(&trhs, i 1) incrémente uniquement trhs[i 1] lorsque ret.data[ i].data == 255 et ret.data[i 1].carry == 1. Cependant, la propagation du report devrait se produire indépendamment de la valeur de ret.data[i].data.
Problème 2 :
Le ret.data[i].data = L'instruction ret.data[i 1].carry ajoute le report à ret.data[i].data, mais c'est incorrect. Le report doit être ajouté au résultat avant de le stocker dans ret.data[i].data.
Solution :
Pour corriger la propagation du report, effectuez ce qui suit changements :
if (i < lhs.nbytes) { ret.data[i].data += ret.data[i + 1].carry; if (ret.data[i].data > 255) { increment(&trhs, i + 1); ret.data[i].data -= 256; // Subtract 256 to adjust for overflow } }
Ces changements garantissent que le report est toujours propagé correctement. Lorsque la somme de deux octets dépasse 255, elle soustrait 256 du ret.data[i].data pour ajuster le débordement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!