2010-08-16 7 views
6

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?

+1

Vous ne manquez rien. Vous pouvez utiliser abs (a) | 0x80000000 à la place. Aucune idée de pourquoi cela serait utile. –

+1

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 ". –

Répondre

7

Il convertit le nombre de sorte que le bit 31 devienne un bit de signe, et les bits restants (0 ... 30) indiquent l'amplitude absolue. par exemple. Si a = -5, alors après l'opération, il devient 0x80000005.

+0

En d'autres termes, il s'agit d'une conversion du complément à la magnitude du signe. (Je me demande où cela est utile dans un compilateur typique.) – Gilles

+0

@Gilles: il peut s'agir du code d'application réel et non d'une optimisation du compilateur. J'ai juste supposé que c'était une optimisation parce que cela ressemblait à un. –

+0

Une suggestion pour laquelle le logiciel d'ingénierie inverse le ferait assez souvent pour que l'OP le remarque en particulier? Je pensais à la possibilité que cela fasse partie d'une conversion de logiciel d'int à la représentation en virgule flottante IEEE 754, mais il me semble qu'il serait toujours plus simple de positionner le bit de signe en dernier dans ces cas. –

0

J'espère sincèrement que la source d'origine dit 0x80000000 et non -2147483648! Le nombre hexadécimal donne au moins un indice au lecteur. La décimale est très cryptique.

+0

Étant le code décompilé, je n'ai aucun moyen de savoir ce que dit la source d'origine. Aussi, cela devrait être un commentaire. –

+0

C'est pourquoi j'ai dit "j'espère que la source originale ..." Je suppose que si vous décomposez que vous n'avez pas la source d'origine. – Jay