2010-08-16 11 views
6

Ich versuche zu lernen, wie Software und alle Tricks rückwärts zu entwickeln, um zu verstehen, wie der Code vor den Compiler-Optimierungen aussieht.a = -2147483648 - a; Compiler-Optimierung

fand ich so etwas wie dies mehrmals:

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

ich ursprünglich dachte, es war ein abs(): eine Unterschreitungen, so dass Sie den positiven Wert erhalten. Aber da a negativ ist (siehe if), ist dies gleichbedeutend mit:

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

die eine sehr geringe negative Zahl sein wird, und nicht der absolute Wert der a überhaupt. Was vermisse ich?

+1

Sie verpassen nichts. Sie könnten abs (a) | verwenden Stattdessen 0x80000000. Keine Ahnung, warum das nützlich wäre. –

+1

Von http://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html - "Also, zum Computer, das Negative einer Zahl nehmen, das heißt, eine Zahl von 0 subtrahieren, ist das Gleiche wie das Invertieren der Bits und das Hinzufügen eines Bits, aus dem der Trick kommt ". –

Antwort

7

Es konvertiert die Zahl so, dass Bit 31 ein Vorzeichenbit wird, und die Restbits (0 ... 30) bezeichnen die absolute Größe. z.B. Wenn a = -5, wird nach der Operation 0x80000005.

+0

Mit anderen Worten ist es eine Umwandlung von Zweierkomplement zu Zeichengröße. (Ich frage mich, wo das in einem typischen Compiler nützlich ist.) – Gilles

+0

@Gilles: Es kann der tatsächliche Anwendungscode sein und keine Optimierung vom Compiler. Ich habe einfach angenommen, dass es eine Optimierung war, weil es wie eine aussah. –

+0

Irgendein Vorschlag, warum die reverse-engineered-Software dies oft genug tun würde, damit das OP es besonders bemerkt? Ich dachte über die Möglichkeit nach, dass dies Teil einer Software-Konvertierung von Int zu IEEE 754 Gleitkommadarstellung ist, aber es scheint mir, dass es immer einfacher wäre, das Zeichenbit in diesen Fällen zuletzt zu positionieren. –

0

Ich hoffe sehr, dass die ursprüngliche Quelle 0x80000000 und nicht -2147483648 die Umwandlung zu werden! Die Hexzahl gibt dem Leser zumindest einen Hinweis. Die Dezimalzahl ist sehr kryptisch.

+0

Als dekompilierter Code habe ich keine Möglichkeit zu wissen, was die ursprüngliche Quelle sagt. Dies sollte auch ein Kommentar sein. –

+0

Deshalb habe ich gesagt "Ich hoffe, die ursprüngliche Quelle ..." Ich vermute, wenn Sie dekompilieren, dass Sie nicht die ursprüngliche Quelle haben. – Jay

Verwandte Themen