Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Welcher Hexwert ist -1 (https://www.delphipraxis.net/203755-welcher-hexwert-ist-1-a.html)

v2afrank 20. Mär 2020 06:00

Welcher Hexwert ist -1
 
Hallo zusammen, in einem meiner älteren Projekt (mit Delphi 2006) werden Daten über eine serielle Schnittstelle empfangen und ausgegeben.
Der User kann dann entscheiden in welcher Darstellung er den Wert sehen möchte.
jetzt hat ein Kollege folgendes bemerkt. Wir empfangen über die Schnittstelle im den Wert $FFFF also 16 gesetzte Bits.
Der hat sich den Wert jetzt als Hexwert ausgeben lassen und -1 erwartet. Heraus kamen jedoch $FFFFFFFF
Auch ein simples
Caption:= IntToHex(-1,2);
liefert $FFFFFFFF.

C# zeigt das gleiche an
Int16 i = -1;
Console.WriteLine(i.ToString("x4"));
Ergibt FFFF

Python und Javascript zeigen jedoch -1 an.

Jetzt habe ich gesehen das in neueren Delphi Versionen die Inttohex Funktion überladen ist.
function IntToHex(Value: Int16): string;
function IntToHex(Value: UInt16): string;

Kann mal einer mit einer neueren Version testen was Delphi hier ausgibt ? Ich habe gestern länger mit dem Kollegen diskutiert und wir sind zu dem Schluß gekommen das wir es zu technisch sehen. $0-$1 ergibt unserer Meinung nach auch -$1 auch wenn es intern vielleicht als $FFFF gespeichert wird

Sherlock 20. Mär 2020 06:37

AW: Welcher Hexwert ist -1
 
Es kommt halt darauf an, wie man die Bitfolge interpretieren möchte.
Aber aus $FFFF macht IntToHex ganz sicher nicht $FFFFFFFF, sondern gibt eine Fehlermeldung aus.

Sherlock

v2afrank 20. Mär 2020 06:55

AW: Welcher Hexwert ist -1
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, man muss den Compiler zwingen ein SmallInt (Int16) zu nehmen siehe Anhang.
Darum die frage was machen die neueren Delphis

Nachtrag:
Zu dem Bild noch, wenn ich einem Smallint die $FFFF zuweise kommt ein Compilerfehler (Konstantenausdruck verletzt die untere Grenz) ist ja auch richtig. Im Prinzip ist mir Datentyp auch egal. Der User erwartet hier nur eben eine -1 oder eben auch eine -A (für Dezimal -10) zu sehen und nicht $FFFF oder (im -10 Fall) $FFF6

Uwe Raabe 20. Mär 2020 07:44

AW: Welcher Hexwert ist -1
 
Wenn du i als SmallInt deklarierst und die Zuweisung castest, sollte es gehen:
Delphi-Quellcode:
var
  i: SmallInt;
begin
  i := SmallInt($FFFF);
  Caption := i.ToString;
...

Redeemer 20. Mär 2020 07:46

AW: Welcher Hexwert ist -1
 
Delphi-Quellcode:
$FFFF
ist das Literal für 65535.
Delphi-Quellcode:
SmallInt($FFFF)
ist -1, oder einfacher
Delphi-Quellcode:
not 0
.

v2afrank 20. Mär 2020 10:44

AW: Welcher Hexwert ist -1
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mist, hatte vergessen meine Antwort abzuschicken.
Das problem ist die Intthex Funktion bei meinem Delphi 2006. Wie in meinem Anhang zu sehen wird aus einer Zuweisung mit $FFFF nach dem IntToHex ein $FFFFFFFF
Dezimal ist es eine -1. Die Frage ist halt wirklich was zeigen die neueren Delphis an.
Smallint -1 wird halt intern als $FFFF abgespeichert. Ich glaube aber immer mehr erwarten als Hexzahl würde ich ein -$1

himitsu 20. Mär 2020 10:52

AW: Welcher Hexwert ist -1
 
Zitat:

Zitat von Redeemer (Beitrag 1460178)
oder einfacher
Delphi-Quellcode:
not 0
.

Für diesen einen Wert von Millliarden anderen stimmt zufällig diese Aussage,
aber NOT hat bei einem Zweierkomplement absolut nichts zu suchen.

p80286 20. Mär 2020 18:20

AW: Welcher Hexwert ist -1
 
Was macht InttoHex? es produziert einen String, der die hexadezimale Repräsentation eines Integers ist.
Da wird nie -1,-255 oder -9 heraus kommen.

Gruß
K-H

samso 21. Mär 2020 07:40

AW: Welcher Hexwert ist -1
 
Ich würde niemals einen Hexstring mit einem Vorzeichen erwarten. So etwas ist sehr ungewöhnlich. Letztendlich wird normalerweise (also in C, Delphi, PHP, ...) die interne Kodierung 1:1 in die Hex-Darstellung überführt. Eine Binärzahl ist aber lediglich eine Abfolge von Nullen und Einsen. Da gibt es kein Vorzeichen, sondern das Vorzeichen wird kodiert. Wenn das Vorzeichen immer in das dritte Bit hinein kodiert werden würde, dann würde ich erwarten, dass das genau so auch in der Hex-Darstellung angezeigt wird. Du könntest dem User auch anbieten, die Zahl als Binär-String oder also Octal-String auszugeben. In keinem dieser Fälle würde ich ein Vorzeichen erwarten, sondern immer die exakte Repräsentation der intern verwendeten Kodierung.
Entweder der User kennt sich mit der Hex-Darstellung aus, dann ist ihm auch bekannt wie eine vorzeichenbehaftete Zahl in der Hexdarstellung aussieht, oder er kennt sich mit der Hex-Darstellung eben nicht aus, dann wird er sich die Zahl auch nicht in der Hex-Darstellung ausgeben lassen.

Zitat:

Zitat von v2afrank (Beitrag 1460196)
Das Problem ist die Intthex Funktion bei meinem Delphi 2006. Wie in meinem Anhang zu sehen wird aus einer Zuweisung mit $FFFF nach dem IntToHex ein $FFFFFFFF

Naja, die Funktion heißt ja auch IntToHex und nicht SmallIntToHex. Eine Funktion SmallIntToHex würde selbstverständlich FFFF liefern.

v2afrank 21. Mär 2020 08:57

AW: Welcher Hexwert ist -1
 
Zitat:

Zitat von samso (Beitrag 1460240)
Ich würde niemals einen Hexstring mit einem Vorzeichen erwarten. So etwas ist sehr ungewöhnlich. Letztendlich wird normalerweise (also in C, Delphi, PHP, ...) die interne Kodierung 1:1 in die Hex-Darstellung überführt. Eine Binärzahl ist aber lediglich eine Abfolge von Nullen und Einsen. Da gibt es kein Vorzeichen, sondern das Vorzeichen wird kodiert. Wenn das Vorzeichen immer in das dritte Bit hinein kodiert werden würde, dann würde ich erwarten, dass das genau so auch in der Hex-Darstellung angezeigt wird. Du könntest dem User auch anbieten, die Zahl als Binär-String oder also Octal-String auszugeben. In keinem dieser Fälle würde ich ein Vorzeichen erwarten, sondern immer die exakte Repräsentation der intern verwendeten Kodierung.
Entweder der User kennt sich mit der Hex-Darstellung aus, dann ist ihm auch bekannt wie eine vorzeichenbehaftete Zahl in der Hexdarstellung aussieht, oder er kennt sich mit der Hex-Darstellung eben nicht aus, dann wird er sich die Zahl auch nicht in der Hex-Darstellung ausgeben lassen.

Zitat:

Zitat von v2afrank (Beitrag 1460196)
Das Problem ist die Intthex Funktion bei meinem Delphi 2006. Wie in meinem Anhang zu sehen wird aus einer Zuweisung mit $FFFF nach dem IntToHex ein $FFFFFFFF

Naja, die Funktion heißt ja auch IntToHex und nicht SmallIntToHex. Eine Funktion SmallIntToHex würde selbstverständlich FFFF liefern.

Aber das ist doch genau was ich wissen möchte. In den neueren Delphi Versionen ist inttohex überladen u.a. auch mit Inttohex(Smallint). Kann nicht einmal jemand mit einer neueren Delphi Verison das Testen ?


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