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
:
Der folgende Code gibt -34
mit alten und neuen Compilern aus:
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?
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:
Das sieht für mich nicht optimal aus (ich habe O2 und O3 mit dem gleichen Ergebnis verwendet), aber es erzeugt das richtige Ergebnis.
Tags und Links c++ c++builder c++builder-2009