Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unterschiedliches Verhalten bei Bitverschiebung (C# / Delphi (https://www.delphipraxis.net/135975-unterschiedliches-verhalten-bei-bitverschiebung-c-delphi.html)

WorstNightmare 21. Jun 2009 13:54


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:
procedure TForm1.Button1Click(Sender: TObject);
var
  a: Integer;
begin
  a := -1024 shr 11;
  Button1.Caption := IntToStr(a);
end;
Ergebnis: 2097151

Code:
        private void button1_Click(object sender, EventArgs e)
        {
            int a = -1024 >> 11;
            button1.Text = Convert.ToString(a);
        }
Ergebnis: -1

Wie kommt es zu so einem unterschiedlichem Ergebnis?

SirThornberry 21. Jun 2009 14:02

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.

Khabarakh 21. Jun 2009 14:08

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
C# benutzt einen arithmetic, Delphi einen logical shift:
http://en.wikipedia.org/wiki/Bitwise...ion#Bit_shifts
https://newsgroups.codegear.com/thre...?threadID=5367

himitsu 21. Jun 2009 14:11

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.

SirThornberry 21. Jun 2009 14:12

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.

Dax 21. Jun 2009 14:16

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Zitat:

Zitat von himitsu
Dann wirst du da wohl etwas selber basteln müssen,
also entweder dir das Ergebnis entsprechende selber berechnen
oder auf ASM ausweichen.

Auf UInt casten reicht.

himitsu 21. Jun 2009 14:24

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Wieso?

Delphis SHR/SHL behandelt doch Signed und Unsigned gleich.

Und er braucht doch SAR (ASM) :wink:

WorstNightmare 21. Jun 2009 14:29

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Ich habe leider keine Ahnung von asm.
Kann mir das einer machen?

himitsu 21. Jun 2009 14:40

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Delphi-Quellcode:
Function ArithmeticShiftRight(i: Integer; Shift: Byte): Integer;
  ASM
    SAR EAX, DL
  End;
ich hoff mal es stimmt

[add]
Delphi-Quellcode:
Function ArithmeticShiftRight(i: Integer; Shift: Byte): Integer;
  Begin
    Result := (i shr Shift) or (($FFFFFFFF * (i shr 31)) shl 32 - Shift)
  End;

jfheins 21. Jun 2009 14:42

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Wie wärs damit:
Delphi-Quellcode:
// arithmetic shift
function arithmetic_shr(a: Integer; b: Byte): Integer;
begin
  Result := Sign(a) * (abs(a) shr b);
end;
okay, asm is vll. n bisschen schneller :angel2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz