![]() |
Konvertiere signed zu unsigned
Hi Leutz,
ich hab mal eine Frage. Ich addiere manchmal signed und unsigned Zahlentypen. Wenn das der Fall ist bringt mir Delphi immer ne Warnung. :shock: Nun, ich weiß warum, aber leider nicht wie ich es weg bekomm. Mit der Funktion abs(), die normalerweise ja den Absolutwert ausgibt, bekomm ich trotzdem die Warnung. Gibts da irgend eine Möglichkeit z.B. einem Integer das Vorzeichen zu klauen (ohne Int64)? Die Warnungen stören nämlich irgendwann enorm. :? |
Re: Konvertiere signed zu unsigned
Delphi-Quellcode:
Der Weg heisst Umtypung (typecast).
var
SignedInt: Integer; UnsignedInt: Cardinal; begin // Warnung if SignedInt > UnsignedInt then // keine Warnung if Cardinal(SignedInt) > UnsifgnedInt then Man muss aber aufpassen was man tut. Der Compiler macht was man ihm befiehlt. Er interpretiert hier SignedInt als Cardinal. |
Re: Konvertiere signed zu unsigned
Danke :thuimb: ,
darauf hätt ich doch glatt auch selbst kommen können. Manchmal fällt einem sowas halt nicht ein. Das mit dem aufpassen ist kein Problem. Ich weiß genau, dass das nie Negativ werden kann. |
Re: Konvertiere signed zu unsigned
Wenn dich nur die Warnung stört kannst du auch
Delphi-Quellcode:
ganz oben in die Unit einfügen
{$WARN COMPARING_SIGNED_UNSIGNED OFF}
|
Re: Konvertiere signed zu unsigned
Das wuerde ich nicht tun. Es ist eine Warnung und kein Hint.
So etwas abzuschalten ist gefaehrlich. Manchmal ist die Warnung angebracht. Sicherheit (= Warnungen in Kauf nehmen oder beseitigen) ist wichtiger als Bequemlichkeit (= Warnungen unterdruecken). Bei der JediVCL haben wir jetzt keinerlei Warnungen oder Hints mehr und nur an einigen Stellen schalten wir die Warnungen fuer einige Zeilen lang ab wo es nicht anders geht. |
Re: Konvertiere signed zu unsigned
Solange Code beim Kompilieren Warnungen oder Hinweise produziert, ist er verbesserungsbeduerftig!
Guter code sollte sich ohne jegliche Warnungen und Hinweise kompilieren lassen. |
Re: Konvertiere signed zu unsigned
@w3seek: Stimmt nicht ganz - Früher war Timer.Interval mal ein Integer, seit Delphi7 oder so ist es ein Cardinal und somit kommen auch die warnungen wenn ich timer.interval mit einem Integer vergleiche. Zu verbessern gibts da nix da es nie vorkommt das der Integer zu groß wird oder der Cardinal < 0. Bei einer simplen Abfrage wie
Delphi-Quellcode:
kommt schon die meldung und die kam bei vorhergehenden versionen nicht... Und ein Typecast drumherum machen ist ja auch nicht besser als die meldung zu unterdrücken
if Timer1.interval > OwnComponent1.interval then
{...] |
Re: Konvertiere signed zu unsigned
@SirThornberry
Das aendert nichts an der Tatsache dass code ohne jeglichen Warnungen und Hinweisen kompiliert werden koennte. Und ja, der Hinweis ist auch in dem Fall berechtigt, denn der Compiler korrigiert automatisch (kann aber auch fehlerhaft korrigiert werden) deinen fehler und warnt dich, dass man eben nur gleiche typen vergleichen soll. angenommen:
Code:
es gibt zwei moeglichkeiten wie man sowas interpretieren koennte:
if -8 (also signed) > 4 (unsigned) then ...
1. beide typen auf signed bringen, dann waere die bedingung false, da -8 nunmal nicht groesser als 4 ist. 2. beide typen auf unsigned bringen, damit wuerde man z.b. wenn man beide auf Cardinal haette folgende bedingung: ($FFFFFFFF-7) > 4 und dann waere die bedingung natuerlich true Ob das im einzelnen fall (wie z.b. Timer) je der Fall ist, kann der compiler nicht wissen. Deshalb lieber einen typecast mehr als eine haessliche Warnung/Hinweis. |
Re: Konvertiere signed zu unsigned
Zitat:
|
Re: Konvertiere signed zu unsigned
Naja, ok - ihr habt recht :? Aber ändern brauch ich trotzdem nix an meinen sourcen da 2 positive werte verglichen werden die niemals außerhalb des eigenen und des anderen Gültigkeitsbereiches sind...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz