Servus zusammen,
ich portiere hier gerade eine C Anwendung nach FPC und es scheint als würde sich der C >> Operator nicht gleich verhalten wie der shr operator von FPC
Konkret, wenn ich eine Negative Zahl right shifte fügt der FPC SHR links 0en ein, der C >> operator aber 1en
Wenn ich -13434880 (als int32) um 16 stellen nach Rechts schiebe kriegt der C Code als Ergebnis -205 und die FPC Variante 65331 raus.
gibt es einen FPC shr befehl der das korrekt macht oder muss ich den selber bauen ?
FPC shr vs C >>
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
FPC shr vs C >>
--
Just try it
Just try it
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: FPC shr vs C >>
Also nach längerem Suchen hab ich doch noch was im Englischen Vorum gefunden:
https://forum.lazarus.freepascal.org/in ... ic=58705.0
Es scheint zu sein wie ich sagte, aber es gibt eine Funktion die "SARLongint" heist, die solls dann richtig machen..
https://forum.lazarus.freepascal.org/in ... ic=58705.0
Es scheint zu sein wie ich sagte, aber es gibt eine Funktion die "SARLongint" heist, die solls dann richtig machen..
--
Just try it
Just try it
-
- Beiträge: 6899
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: FPC shr vs C >>
Ich habe es ausprobiert, aber beide Variante spucken da Gleiche aus.
Code: Alles auswählen
uses
StrUtils;
var
i: smallint = %1010101010101010;
j: integer;
begin
i:= %1010101010101010;
for j := 0 to 16 do begin
WriteLn(i: 8, ' ', IntToBin(i, 16));
i := SarLongint(i, 1);
end;
WriteLn();
i:= %1010101010101010;
for j := 0 to 16 do begin
WriteLn(i: 8, ' ', IntToBin(i, 16));
i := i shr 1;
end;
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 945
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: FPC shr vs C >>
Das Problem bei Typen < 32-bit, zumindest unter x86 ist, dass der Compiler sie auf 32-bit erweitert und zwar per "signed extension", das heißt in den oberen 16-bit werden bei einem negativen 16-bit Wert 1en sein, welche dann per shr nach unter verschoben werden. Bei 32- und 64-bit Werten muss der Wert nicht erweitert werden, weswegen dann per shr 0en reingeschoben werden.Mathias hat geschrieben: Do 16. Jan 2025, 19:20 Ich habe es ausprobiert, aber beide Variante spucken da Gleiche aus.
Das Verhalten ist hier zwischen FPC und Delphi identisch.
FPC Compiler Entwickler
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: FPC shr vs C >>
also bei Int64 ists auch, muss nu durch meinen ganzen Code gehen und das fixen..
--
Just try it
Just try it
-
- Beiträge: 6899
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: FPC shr vs C >>
Wen wir schon bei Fallen von C sind, das könnte auch noch zum Thema passen : https://www.c-plusplus.net/forum/topic/ ... o_string/3
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot