![]() |
Unterschiedliches Verhalten bei Bitverschiebung (C# / Delphi
Hallo,
ich übersetze gerade mal wieder ein Programm von C# nach Delphi. Da das Resultat nicht so funktionierte wie es sollte, habe ich nach dem Fehler gesucht und ihn auch gefunden:
Delphi-Quellcode:
Ergebnis: 2097151
procedure TForm1.Button1Click(Sender: TObject);
var a: Integer; begin a := -1024 shr 11; Button1.Caption := IntToStr(a); end;
Code:
Ergebnis: -1
private void button1_Click(object sender, EventArgs e)
{ int a = -1024 >> 11; button1.Text = Convert.ToString(a); } Wie kommt es zu so einem unterschiedlichem Ergebnis? |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
also mir ist das c# Ergebnis schleierhaft. Wenn eine Zahl negativ ist so ist das höchste bit gesetzt. Und wenn man nach rechts shiftet sollte dieses Bit mit wandern. Entsprechend sollte bereits beim Shiften um 1 nach Rechts keine negative Zahl das Ergebnis sein da eben das "NegativBit" weg geshiftet wurde.
|
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
C# benutzt einen arithmetic, Delphi einen logical shift:
![]() ![]() |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Dann wirst du da wohl etwas selber basteln müssen,
also entweder dir das Ergebnis entsprechende selber berechnen oder auf ASM ausweichen. |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Ich glaub ich hab müll gepostet - das höchste bit steht doch gar nicht für Minus - es wird Zeit das ich mir das mal wieder etwas genauer ansehe.
|
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Zitat:
|
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Wieso?
Delphis SHR/SHL behandelt doch Signed und Unsigned gleich. Und er braucht doch SAR (ASM) :wink: |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Ich habe leider keine Ahnung von asm.
Kann mir das einer machen? |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Delphi-Quellcode:
ich hoff mal es stimmt
Function ArithmeticShiftRight(i: Integer; Shift: Byte): Integer;
ASM SAR EAX, DL End; [add]
Delphi-Quellcode:
Function ArithmeticShiftRight(i: Integer; Shift: Byte): Integer;
Begin Result := (i shr Shift) or (($FFFFFFFF * (i shr 31)) shl 32 - Shift) End; |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Wie wärs damit:
Delphi-Quellcode:
okay, asm is vll. n bisschen schneller :angel2:
// arithmetic shift
function arithmetic_shr(a: Integer; b: Byte): Integer; begin Result := Sign(a) * (abs(a) shr b); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz