2010-08-16 13 views
6

Sto cercando di imparare come eseguire il reverse engineering del software e tutti i trucchi per capire come appare il codice prima delle ottimizzazioni del compilatore.a = -2147483648 - a; ottimizzazione del compilatore

ho trovato qualcosa di simile a questo più volte:

if (a < 0) 
     a = -2147483648 - a; 

ho inizialmente pensato che fosse un abs(): un underflow in modo da ottenere il valore positivo. Ma dal momento che a è negativo (vedi il caso), questo equivale a:

if (a < 0) 
     a = -2147483648 + abs(a); 

che sarà un numero molto piccolo negativo, e non il valore assoluto di a a tutti. Cosa mi manca?

+1

Non ti manca nulla. Potresti usare abs (a) | 0x80000000 invece. Non ho idea del perché sarebbe utile. –

+1

Da http://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html - "Quindi, al computer, prendendo il negativo di un numero, cioè sottraendo un numero da 0, è lo stesso di invertire i bit e aggiungerne uno, che è da dove viene il trucco ". –

risposta

7

Si sta convertendo il numero in modo che il bit 31 diventi un bit di segno e il resto (0 ... 30) denoti la magnitudine assoluta. per esempio. se a = -5, dopo l'operazione diventa 0x80000005.

+0

In altre parole è una conversione dal complemento a due alla grandezza del segno. (Mi chiedo dove sia utile in un tipico compilatore.) – Gilles

+0

@Gilles: potrebbe essere il codice effettivo dell'applicazione e non un'ottimizzazione dal compilatore. Ho appena pensato che fosse un'ottimizzazione perché sembrava uno. –

+0

Qualche suggerimento sul perché il software di reverse engineering lo farebbe abbastanza spesso perché l'OP lo noti in particolare? Stavo pensando alla possibilità che questo fosse parte di una conversione del software da int alla rappresentazione in virgola mobile IEEE 754, ma mi sembra che sarebbe sempre più semplice posizionare il bit del segno per ultimo in questi casi. –

0

Mi auguro sinceramente che la fonte originale, ha detto 0x80000000 e non -2147483648! Il numero esadecimale almeno dà al lettore un indizio. Il decimale è molto criptico.

+0

Essendo il codice decompilato, non ho modo di sapere cosa dice la fonte originale. Inoltre, questo dovrebbe essere un commento. –

+0

Ecco perché ho detto "Spero che la fonte originale ..." ho presunto se stai decompilando che non hai la fonte originale. – Jay

Problemi correlati