Delphi-Version: 5
Datentyp "Int64" fehlerhaft?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphifreunde!
Im Anhang befindet sich ein mit Delphi 4 erstelltes Kleinprojekt, das ein merkwürdiges Verhalten mit dem Datentyp Int64, auf das ich stieß, demonstrieren soll. Los geht es mit dem Wert 2048. Die damit gefüllte Int64-Variable wird zunächst mit 32, dann mit 16 linksverschoben. Bis dahin ist noch alles in Ordnung. Beim nächsten shl (um 4) wird der Wert erstmalig negativ. Soweit noch nichts schlimmes, nur bekomme ich diese negative Vorzeichen nicht beseitigt. Weder mit abs, mit "-" noch die Multiplikation mit -1 können daran etwas ändern. Ich versuchte sogar den umständlichen Weg über inttostr, dann vom String das erste Zeichen abzuschneiden und zum Schluß mit strtoint64 an den positiven Wert zu gelangen, doch das gibt eine Fehlerausgabe. Das liegt, wie ich herausfand, daran, daß die äußerste Funktion - strtoint64 - an dem um das Minuszeichen befreiten String scheitert. Compilate von Delphi 5, 6, 7 und Turbo-Delphi zeigen das gleiche (Fehl-?)Verhalten. Ist dieses Verhalten Euch bekannt? Gibt es sonst noch eine Lösung, das zu beseitigen? M.E. ist das ein klarer Fehler. Vielen Dank im voraus und beste Grüße Delphi-Laie |
AW: Datentyp "Int64" fehlerhaft?
Eigentlich kein Fehler. Der Wertebereich eine Int64 ist -2^64 bis (2^64)-1. Wenn du so willst, dann ist die 0 die erste positive Zahl. Von daher ist das alles vollkommen legitim. Subtrahiere von deinem Wert mal die Zahl 1. Dann siehst du, dass das Ergebnis direkt wieder positiv ist.
Das gleiche Verhalten kannst du auch im Windows Taschenrechner beobachten. |
AW: Datentyp "Int64" fehlerhaft?
Sorry: Der Wertebereich von Int64 ist -2^63 bis (2^63)-1. (63 = 11 + 32 + 16 + 4)
|
AW: Datentyp "Int64" fehlerhaft?
Es gibt auch den Datentyp UInt64, der geht von 0 bis 2^64-1 und kennt keine negativen Zahlen.
|
AW: Datentyp "Int64" fehlerhaft?
Zitat:
Da bin ich wohl 2 mal auf der Tastatur ausgerutscht.:roll: Ne du hast natürlich recht. Ich lasse meinen Beitrag dann aber mal so stehen sonst macht deiner keinen Sinn mehr. Danke für die Korrektur. |
AW: Datentyp "Int64" fehlerhaft?
Das ist ein völlig richtiges Verhalten und ist der Darstellung von Integerzahlen als Zweierkomplement geschuldet, Dein Endergebnis ist uint64($8000000000000000). Das gleiche tritt bei kleineren Datentypen auf, zB. bleibt longint($80000000) bei 32-Bit-Negation unverändert.
|
AW: Datentyp "Int64" fehlerhaft?
Erstmal danke für die rege Beteiligung!
Zitat:
Damit habe ich das Projekt ersatzweise auch ausprobiert. Der Wert rutscht aber auch in's negative. Habe es soeben mit Delphi 3 und Cardinal ausprobiert. Auch Cardinal rutscht in's Negative, beim nächsten shl dann unweigerlich auf 0. Und sogar dann, wenn man statt shl y" ein * 2^y verwendet. Daß so etwas mit vorzeichenlosen Typen möglich ist, ist mir völlig neu. Wieder etwas dazugelernt. Dann werde ich vermutlich auch kaum Chancen haben, diese negativen Vorzeichen wegzubekommen, oder hat dazu noch jemand eine Idee? Viele Grüße Delphi-Laie |
AW: Datentyp "Int64" fehlerhaft?
+9223372036854775808 überschreitet halt den Wertebereich von Int64. Deshalb ist das nicht darstellbar. Was willst Du denn am Ende erreichen?
|
AW: Datentyp "Int64" fehlerhaft?
Zitat:
Dieser Wert entsteht - und zwar im Visual Studio ohne Vorzeichen - wen die C(++?)-Funktion
Code:
mit 2048 aufgerufen wird. Sie entstammt diesem Projekt und wird zur Berechnung der optimalen Länge von zu verschmelzenden Teilarrays benötigt. Die wollte ich mit Delphi nachbilden. Bis 2047 ist auch in Delphi alles in Ordnung, ab 2048 aber nicht mehr, weil dieser zitierte Wert negativ wird und das Minuszeichen nicht beseitigt werden kann, und zwar auch nicht mit dem Datentyp UInt64 (in Delphi 7). Ich werde weiter forschen.
int CLZ(uint64_t x) {
printf(""); int n; if (x == 0) { return 64; } n = 0; if (x <= 0x00000000FFFFFFFFL) {n = n + 32; x = x << 32;} if (x <= 0x0000FFFFFFFFFFFFL) {n = n + 16; x = x << 16;} if (x <= 0x00FFFFFFFFFFFFFFL) {n = n + 8; x = x << 8;} if (x <= 0x0FFFFFFFFFFFFFFFL) {n = n + 4; x = x << 4;} if (x <= 0x3FFFFFFFFFFFFFFFL) {n = n + 2; x = x << 2;} if (x <= 0x7FFFFFFFFFFFFFFFL) {n = n + 1;} return n; } Gruß Delphi-Laie |
AW: Datentyp "Int64" fehlerhaft?
Was hältst Du von dieser Idee?
Delphi-Quellcode:
function CLZ(x: Int64): Integer;
var n: Integer; begin if (x = 0) then Result := 64 else begin n := 0; if (x and not $00000000FFFFFFFF)=0 then begin n := n + 32; x := x shl 32; end; if (x and not $0000FFFFFFFFFFFF)=0 then begin n := n + 16; x := x shl 16; end; if (x and not $00FFFFFFFFFFFFFF)=0 then begin n := n + 8; x := x shl 8; end; if (x and not $0FFFFFFFFFFFFFFF)=0 then begin n := n + 4; x := x shl 4; end; if (x and not $3FFFFFFFFFFFFFFF)=0 then begin n := n + 2; x := x shl 2; end; if (x and not $7FFFFFFFFFFFFFFF)=0 then n := n + 1; Result := n; end; end; |
AW: Datentyp "Int64" fehlerhaft?
Zitat:
Zitat:
Delphi-Quellcode:
function CLZ(var x: UInt64): Integer;
begin if x = 0 then Result := 64 else begin Result := 0; if x <= $00000000FFFFFFFF then begin Result := Result + 32; x := x shl 32; end; if x <= $0000FFFFFFFFFFFF then begin Result := Result + 16; x := x shl 16; end; if x <= $00FFFFFFFFFFFFFF then begin Result := Result + 8; x := x shl 8; end; if x <= $0FFFFFFFFFFFFFFF then begin Result := Result + 4; x := x shl 4; end; if x <= $3FFFFFFFFFFFFFFF then begin Result := Result + 2; x := x shl 2; end; if x <= $7FFFFFFFFFFFFFFF then begin Result := Result + 1; end; end; end; |
AW: Datentyp "Int64" fehlerhaft?
Zitat:
|
AW: Datentyp "Int64" fehlerhaft?
Zitat:
da gab es einen Bug im Delphi, wo UInt64 teilweise wie ein Int64 behandelt wurde. Für 32 Bit-Anwendungen gibt es eine 64 Bit-Emulation, wo der Compiler bei den Integer-Operatoren + - * div mod and or nicht die CPU rechnen lässt, sondern das mit 32 Bit-Operationen in der System.pas erledigt. Der Bug bestand darin, dass der Compiler bei UInt64 ausversehn die Funktionen für Int64 verwendete. |
AW: Datentyp "Int64" fehlerhaft?
Zitat:
Delphi-Quellcode:
if x<=$FFFFFFFF then
usw. Dabei stieß ich dann bei Eingabewerten ab 2048 an die 64-Bit-Grenze, die schier unüberwindlich schien. Jedenfalls sortiert das erste Timsort in diesem Projekt nun auch bei Elementeanzahlen ab 2048 so schnell, wie es sein soll, also auch hinsichtlich der Geschwindigkeit korrekt. Das ist Dein Verdienst, und dafür danke ich Dir sehr! Danke auch an die anderen, die sich beteiligten! Meine Fehlervermutung hat sich wieder einmal nicht bestätigt. Was ich allerdings immer noch nicht begreife, ist, wieso wiederholte Multiplikationen oder shl-Befehle bei vorzeichenlosen Integertypen zum Ende in negative Werte einmünden (können). |
AW: Datentyp "Int64" fehlerhaft?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 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