Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mausrad simulieren (https://www.delphipraxis.net/106768-mausrad-simulieren.html)

Klaus01 16. Jan 2008 18:07

Re: Mausrad simulieren
 
Nun, wenn ich das so wandele:

Delphi-Quellcode:
edit1.Text:= IntToStr(dword(-120));
kommt kein -120 heraus.

Heißt das Minus denn nicht, daß das highbit auf 1 ist.
Wenn man dann einen signed Wert hat wird das highbit als Minus
interpretiert und man hat eine negative Zahl.

Grüße
Klaus

DeddyH 16. Jan 2008 18:10

Re: Mausrad simulieren
 
Ja eben, binär sind beide vollkommen gleich, erst durch das Casten in signed/unsigned ändern sie ggf. ihren Wert.

taaktaak 16. Jan 2008 18:11

Re: Mausrad simulieren
 
Ja richtig!
Genau das hätte ich auch erwartet:

Aber mit folgenden Code bleibt es bei -120 ...

Delphi-Quellcode:
procedure TfoTest9.buWhatsThisClick(Sender:TObject);
var t : Dword;
begin
  t:=dword(-120);
  showmessage(inttostr(integer(t)));
end;
Hihihihi - die Information, dass es sich um eine negative Zahl handelt, bleibt also erhalten (muss ja auch, sonst würd's mit dem Mausrad ja nicht funktionieren

DeddyH 16. Jan 2008 18:15

Re: Mausrad simulieren
 
Zitat:

Zitat von taaktaak
Hihihihi - die Information, dass es sich um eine negative Zahl handelt, bleibt also erhalten (muss ja auch, sonst würd's mit dem Mausrad ja nicht funktionieren

Logisch, die Information steht ja in einem einzigen Bit ;)

Dunkel 16. Jan 2008 18:40

Re: Mausrad simulieren
 
Aha. Also gibt es so gesehen (im Speicher) keinen Unterschied zwischen (ganzzahligen) signed/unsigned Datentypen, bis auf dass bei signed-Datentypen das High-Bit interpretiert wird, bei unsigned-Datentypen dieses ignoriert wird? Interessant.

_frank_ 16. Jan 2008 18:48

Re: Mausrad simulieren
 
Zitat:

Zitat von DeddyH
Logisch, die Information steht ja in einem einzigen Bit ;)

imho liegt -1 (integer) als $FFFFFFFF im speicher, 1 dagegen als $00000001. -2 dann $FFFFFFFE, usw.

negative Zahlen werden also als $FFFFFFFF-abs(wert+1) dargestellt

folglich ist nicht 1 bit für die Kennzeichnung negativer Werte zuständig. Es wären eher die ersten 16 bit (bei 32bit-Integer-Werten), sind alle 0 ist die Zahl positiv.

//edit
kleines Codebeispiel zum Testen:
Delphi-Quellcode:
for i:=-10 to 10 do
begin
  memo1.lines.Add(format('%.2d: %.8x',[i,i]));
end;
Gruß Frank

DeddyH 16. Jan 2008 19:04

Re: Mausrad simulieren
 
Wenn bei 32-Bit-Werten die ersten 16 nur für das Vorzeichen verwendet würden, wäre das aber extrem ineffektiv.

_frank_ 16. Jan 2008 19:17

Re: Mausrad simulieren
 
Zitat:

Zitat von DeddyH
Wenn bei 32-Bit-Werten die ersten 16 nur für das Vorzeichen verwendet würden, wäre das aber extrem ineffektiv.

ich hab nicht gesagt/gemeint, dass die ersten ersten 16 bit *nur* für das Vorzeichen verwendet werden, sondern dass man ggf. die ersten 16 bit braucht, um erkennen zu können, ob es sich um eine negative zahl handelt.
Wobei es durchaus sein kann dass man das höchstwertige bit als indikator auslesen kann, da ab diesen Wert die Negativen werte losgehen müssten. ich hab das jetzt nicht bis zuende getestet ;) jedefalls ists nicht so, dass man nur das höchstwertige bit setzen muss, um aus einer positiven Zahl eine negative machen kann.

ich vermute mal das die zahlen in der reihenfolge so im speicher liegen:
0,1..2147483647,-2147483648..-1 ($0-$FFFFFFFF)

da fällt mir grade ein Fehler in meiner Delphi-hilfe (3) auf.
Integer -2147483648..2147483647 32 Bit einschließlich Vorzeichen
Cardinal 0..2147483647 32 Bit, besitzt kein Vorzeichen
eigentlich müsste der Wertebereich von cardinal doppelt so groß sein...ist ja bei 16bit auch so:
Smallint -32768..32767 16 Bit einschließlich Vorzeichen
Word 0..65535 16 Bit, besitzt kein Vorzeichen

Gruß Frank

Apollonius 16. Jan 2008 19:25

Re: Mausrad simulieren
 
Du brauchst nur das erste Bit zur Vorzeichenbestimmung. $80000000 ist negativ, $7FFFFFFF positiv, das ist die Grenze der Vorzeichen und da änderst sich auch der Wert des höchstwertigen Bits.
Diese Darstellung hat übrigens zur Folge, dass die Addition von signed und unsigned Werten genau gleich verläuft. Nur die Interpretation ist anders.

DeddyH 16. Jan 2008 19:33

Re: Mausrad simulieren
 
Versuch mal Folgendes:
Delphi-Quellcode:
var Zahl: integer;
begin
  Zahl := MAXINT; //011111111 11111111 11111111 11111111
  ShowMessage(inttostr(Zahl));
  Zahl := Zahl xor (1 shl 31); //11111111 11111111 11111111 11111111
  ShowMessage(inttostr(Zahl));
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:36 Uhr.
Seite 2 von 2     12   

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