FPC shr vs C >>

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
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 >>

Beitrag von corpsman »

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 ?
--
Just try it

Benutzeravatar
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 >>

Beitrag von corpsman »

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..
--
Just try it

Mathias
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 >>

Beitrag von Mathias »

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

PascalDragon
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 >>

Beitrag von PascalDragon »

Mathias hat geschrieben: Do 16. Jan 2025, 19:20 Ich habe es ausprobiert, aber beide Variante spucken da Gleiche aus.
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.

Das Verhalten ist hier zwischen FPC und Delphi identisch.
FPC Compiler Entwickler

Benutzeravatar
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 >>

Beitrag von corpsman »

also bei Int64 ists auch, muss nu durch meinen ganzen Code gehen und das fixen..
--
Just try it

Mathias
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 >>

Beitrag von Mathias »

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

Antworten