Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Multiplikation Int64*UInt64 fehlerhaft? (https://www.delphipraxis.net/171561-multiplikation-int64%2Auint64-fehlerhaft.html)

Memnarch 12. Nov 2012 16:27

Delphi-Version: XE

Multiplikation Int64*UInt64 fehlerhaft?
 
Nabend,

Wollte mal wissen was gemacht wird wenn ich UInt64*Int64 multipliziere. im assembler steht der aufruf _llmul



kann aber nur die implementation finden, die besagt, dass beide parameter Int64 sind o.O

(habe ich mich verguckt?)

BUG 12. Nov 2012 16:42

AW: Multiplikation Int64*UInt64 fehlerhaft?
 
Ich würde vermuten dass UInt64 in dem Fall implizit (hart) auf Int64 gecastet wird.

Delphi scheint die vorzeichenbehafteten Typen zu bevorzugen:
Zitat:

Zitat von http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/expressions_xml.html
the result is of type Int64 when at least one operand is of type Int64; otherwise, the result is of type Integer. If an operand's type is a subrange of an integer type, it is treated as if it were of the integer type.



Wenn die UInt64 Variable zu groß wäre, gäbe es ein Problem. Für Zahlen im positiven Wertebereich von Int64 funktioniert sollte das aber funktionieren.

Stevie 12. Nov 2012 16:58

AW: Multiplikation Int64*UInt64 fehlerhaft?
 
Normalerweise würdest du an der Stelle "W1024: Combining signed and unsigned types - widened both operands (Delphi)" bekommen. Tjo, nur leider gibts kein Int128, auf den beide erweitert werden können.

Wie BUG schon richtig erwähnte, versucht Delphi natürlich das Vorzeichen zu behalten. Witzigerweise läuft da nicht alles so richtig ab:

Delphi-Quellcode:
var
  i1: Uint64;
  i2: UInt64;
  i3: Int64;
  i4: Uint64;
begin
  i1 := High(Int64);
  i4 := i1 * 2;
  Assert(i4 = High(UInt64) - 1); // läuft...

  i2 := 2;
  i4 := i1 * i2;
  Assert(i4 = High(UInt64) - 1); // läuft auch...

  i3 := 2;
  i4 := i1 * i3; // BOING! range check error?!
Vermutlich eine der vielen Stellen, wo UInt64 einfach buggy ist.

Memnarch 12. Nov 2012 19:57

AW: Multiplikation Int64*UInt64 fehlerhaft?
 
Mh,
vllt sollte der Compiler dann eher das kombinieren von s/u Int64 "blocken" ? ("Operator not applicable for...")

oder wir führen Int128 und int256 ein :D

BUG 12. Nov 2012 20:07

AW: Multiplikation Int64*UInt64 fehlerhaft?
 
Zitat:

Zitat von Memnarch (Beitrag 1190904)
oder wir führen Int128 und int256 ein :D

Ich persönlich hätte nicht gegen generische Typen á la
Delphi-Quellcode:
Int<bits>
und
Delphi-Quellcode:
UInt<bits>
oder sogar
Delphi-Quellcode:
Float<mantissa, exponent>
.
Natürlich mit etwas Compilermagie, damit direkt vom Prozessor unterstützte Breiten auch schnell sind.

Aber da gibt es wohl zuwenig Anwendungsfälle für :mrgreen:

himitsu 12. Nov 2012 22:18

AW: Multiplikation Int64*UInt64 fehlerhaft?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Gibt es doch schon? (in XE3, aber seit TDE/D2006 könnte sich das jeder bequem selber basteln und selbst Lazarus sollte sowas hinbekomen :stupid: )

Anhang 38055

UInt64 ist schon länger Buggy, aber es wurden von Zeit zu Zeit immer mehr Fehler ausgebaut.

Diese Typen werden ja nicht direkt von der CPU (FPU) unterstützt und werden emuliert.
Aber die letzen Fehler, welche ich kannte, bzw. mitbekommen hab, waren darin beegründet, daß der Compiler bei MUL, DIV und MOD für UInt64 versehentlich dennoch die Int64-Proceduren verwendet hatte.

Aber ich glaub das repariert keiner mehr, denn aus den 64-Bit Sourcen sind diese Codes rausgeflogen.
(die hätte man doch ganz gut für einen 128-Bit-Integer weiter nutzen können :stupid:)

himitsu 12. Nov 2012 22:26

AW: Multiplikation Int64*UInt64 fehlerhaft?
 
[del]


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