Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   shl mit 8 Bit (https://www.delphipraxis.net/211266-shl-mit-8-bit.html)

BergLoewe 24. Aug 2022 10:49

Delphi-Version: 5

shl mit 8 Bit
 
Hallo,


ich muß für eine Prüfsumme Bits in einem einzelnen Byte verschieben. Theoretisch mit shl weniger das Problem. Praktisch kommt es aber irgendwie zu einem Überlauffehler. Denn wenn das oberste Bit 7 eine 1 ist, bringt er mir einen Rangefehler. Da will er das Bit wahrscheinlich nicht in den Papierkorb fallen lassen und weiß nicht wohin.
Wie bring ich Delphi denn aber genau dazu, dass das oberste Bit beim Linksschieben verschwindet?

DeddyH 24. Aug 2022 11:04

AW: shl mit 8 Bit
 
Du könntest für die entsprechende Routine RangeChecks abschalten, da es sich ja um gewollte Überläufe handelt, siehe auch https://www.delphipraxis.net/140406-...auslesbar.html

BerndS 24. Aug 2022 11:24

AW: shl mit 8 Bit
 
Eine weiter Möglicheit wäre es, das oberste bit vor dem shl zu entfernen.
Delphi-Quellcode:
B := (B and $7F) shl 1;

himitsu 24. Aug 2022 12:31

AW: shl mit 8 Bit
 
Nach dem Shift auf Byte casten, wäre wohl auch möglich.


Du kannst dir ja mal im Assembler ansehn, was bei deiner Rechnung generiert wurde.


Enteder wird da im Integer (ganzes Register) geshiftet und danach passt der Wert nicht mehr in die Byte-Variable.

Oder die RangeCheck-Routine prüft auch bei binären Operationen die Überlauf-Bits.
Hätte aber gedacht, das würde nur bei mathematischen Operationen gemacht (nicht bei Binären).

BergLoewe 24. Aug 2022 17:18

AW: shl mit 8 Bit
 
Zitat:

Zitat von DeddyH (Beitrag 952391)
Moin,

ich steh gerade auf dem Schlauch. Ich möchte einen Compilerschalter (Rangechecks) temporär umstellen, diesen aber später wieder in den alten Zustand versetzen. Dazu müsste ich ja den alten Zustand erst einmal erfragen. Geht das überhaupt und wenn ja, wie? Ich meinte das in der Art
Delphi-Quellcode:
{$IF RANGECHECKS}
  {$DEFINE WAR_AN}
    {$RANGECHECKS OFF}
    //Hier der entsprechende Code
  {$IFDEF WAR_AN}
    {$RANGECHECKS ON}
  {$ENDIF}

Besten Dank, das hat mich gehelft!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 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