Comment soustraire deux entiers non signés avec les enrouler autour de débordement ou

Il existe deux entiers non signés (x et y) qui doivent être soustraits. x est toujours plus grand que y. Cependant, à la fois x et y peut s'enrouler autour d'; par exemple, si ils étaient tous les deux octets, après 0xff vient 0x00. Le cas problème est que si x entoure, tout en y ne pas. Maintenant x semble être plus petit que y. Heureusement, x sera pas autour de deux fois (une seule fois est garanti). En supposant octets, x a enveloppé et est maintenant 0x2, tandis que y a pas et est 0xFE. Le droit de réponse de x - y est censé être 0x4.

Peut-être,

( x > y) ? (x-y) : (x+0xff-y);

Mais je pense qu'il y a une autre façon, quelque chose avec la 2s compliment?, et dans ce système embarqué, x et y sont le plus grand unsigned int types, de sorte que l'ajout de 0xff... n'est pas possible

Quelle est la meilleure façon d'écrire l'instruction (de la langue cible, C)?

  • Ce que vous, sauf à partir de cette "meilleure façon" ? Veuillez préciser vos exigences ...
  • Que voulez-vous dire "à la fois x et y peuvent s'enrouler autour de"? Voulez-vous dire qu'ils pourraient s'enrouler autour de si en fonte de non signé signé types?
  • Les deux entiers non signés. Le cas problème est que si x entoure, tout en y ne pas. Maintenant x semble être plus petit que y. Heureusement, x sera pas autour de deux fois (une seule fois est garanti). En supposant octets, x a enveloppé et est maintenant 0x2, tandis que y a pas et est 0x14. Le droit de réponse de x - y est censé être 0x4. ( x > y) ? (x-y) : (x+0xff-y); mais je pense qu'il y a une autre façon, et dans ce système embarqué, x et y sont le plus grand unsigned int types, de sorte que l'ajout de 0xff... n'est pas possible.
  • Si un signé valeur intégrale est "enroulé autour de" (survolé), tous les paris sont éteints. Si vous êtes sur un complément à deux, vous pouvez toujours soustraire assigner à un unsigned valeur, mais ce n'est pas portable. Garbage in, Garbage out.
  • Votre reformulé la question fait encore que peu de sens. La valeur n'enveloppent pas par eux-mêmes. Une fois que vous avez x que x ne sera pas envelopper n'importe où jusqu'à ce que vous commencez à les modifier en quelque sorte. Si vous êtes de la modifier, de nous montrer comment. En ce moment il n'y a aucun moyen de vraiment comprendre ce que "envelopper" vous êtes talikng sur.
  • Alok: entier Signé de débordement est un comportement indéfini.
  • Également intéressant d'avoir un regard sur: Est entier non signé de la soustraction comportement défini? 🙂

InformationsquelleAutor mgag | 2010-01-13