AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Unterschiedliches Verhalten bei Bitverschiebung (C# / Delphi

Unterschiedliches Verhalten bei Bitverschiebung (C# / Delphi

Ein Thema von WorstNightmare · begonnen am 21. Jun 2009 · letzter Beitrag vom 21. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2   
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#1

Unterschiedliches Verhalten bei Bitverschiebung (C# / Delphi

  Alt 21. Jun 2009, 14:54
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:02
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:08
C# benutzt einen arithmetic, Delphi einen logical shift:
http://en.wikipedia.org/wiki/Bitwise...ion#Bit_shifts
https://newsgroups.codegear.com/thre...?threadID=5367
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#4

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:11
Dann wirst du da wohl etwas selber basteln müssen,
also entweder dir das Ergebnis entsprechende selber berechnen
oder auf ASM ausweichen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:12
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:16
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#7

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:24
Wieso?

Delphis SHR/SHL behandelt doch Signed und Unsigned gleich.

Und er braucht doch SAR (ASM)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#8

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:29
Ich habe leider keine Ahnung von asm.
Kann mir das einer machen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#9

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:40
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:42
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 Uhr.
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