J'essaie d'apprendre à faire du reverse engineering de logiciels et de toutes les astuces pour comprendre à quoi ressemble le code avant les optimisations du compilateur.a = -2147483648 - a; Optimisation du compilateur
J'ai trouvé quelque chose comme ceci plusieurs fois:
if (a < 0)
a = -2147483648 - a;
je pensais à l'origine était un abs()
: un sousverses si vous obtenez la valeur positive. Mais depuis a
est négatif (voir le cas), cela équivaut à:
if (a < 0)
a = -2147483648 + abs(a);
qui sera un nombre négatif très faible, et non la valeur absolue de a
du tout. Qu'est-ce que je rate?
Vous ne manquez rien. Vous pouvez utiliser abs (a) | 0x80000000 à la place. Aucune idée de pourquoi cela serait utile. –
De http://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html - "Donc, à l'ordinateur, en prenant le négatif d'un nombre, c'est-à-dire en soustrayant un nombre de 0, est la même chose que d'inverser les bits et d'en ajouter un, d'où vient l'astuce ". –