Verständnis des Verhaltens von altem C ++ Code

8

Ich migriere einige Teile von altem C ++ - Code, ursprünglich kompiliert mit CodeGear C ++ Builder® 2009 Version 12.0.3170.16989

Der folgende Code - minimale Version eines größeren Stückes - gibt -34 mit jedem modernen Compiler aus. Obwohl in der ursprünglichen Plattform 84 :

ausgegeben wird %Vor%

Der folgende Code gibt -34 mit alten und neuen Compilern aus:

%Vor%

Auch das manuelle Ausrollen der Schleife scheint mit beiden Compilern zu funktionieren:

%Vor%

Es ist wichtig, dass ich das Verhalten des alten Codes anpasse. Kann mir bitte jemand helfen, zu verstehen, warum der ursprüngliche Compiler diese Ergebnisse produziert?

    
ibancg 13.08.2017, 15:24
quelle

1 Antwort

5

Dies scheint ein Fehler zu sein:

Die Zeile

%Vor%

generiert den folgenden Code:

%Vor%

Das macht keinen Sinn. Das ist ungefähr so:

%Vor%

Und das erklärt, wie das Ergebnis zustande kam: 0x01 ^ 0x55 ist tatsächlich 0x54 oder 84 .

Es sollte etwa so aussehen:

%Vor%

Das ist also definitiv ein Fehler bei der Code-Generierung. Es scheint bis jetzt, C ++ Builder 10.2 Tokyo, für den "klassischen" (Borland) Compiler zu bestehen.

Aber wenn ich den "new" (clang) Compiler verwende, wird 222 erzeugt. Der erzeugte Code ist:

%Vor%

Das sieht für mich nicht optimal aus (ich habe O2 und O3 mit dem gleichen Ergebnis verwendet), aber es erzeugt das richtige Ergebnis.

    
Rudy Velthuis 13.08.2017, 21:46
quelle

Tags und Links