AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datentyp "Int64" fehlerhaft?

Ein Thema von Delphi-Laie · begonnen am 18. Jun 2017 · letzter Beitrag vom 19. Jun 2017
Antwort Antwort
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 10:15
Erstmal danke für die rege Beteiligung!

Es gibt auch den Datentyp UInt64, der geht von 0 bis 2^64-1 und kennt keine negativen Zahlen.
Yo, ab Delphi 7.

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

Geändert von Delphi-Laie (19. Jun 2017 um 10:19 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#2

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 10:25
+9223372036854775808 überschreitet halt den Wertebereich von Int64. Deshalb ist das nicht darstellbar. Was willst Du denn am Ende erreichen?
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 10:53
+9223372036854775808 überschreitet halt den Wertebereich von Int64. Deshalb ist das nicht darstellbar. Was willst Du denn am Ende erreichen?
Das ist mir auch gerade klargeworden. Ist 2^63, int64 geht aber nur bis 2^63-1.

Dieser Wert entsteht - und zwar im Visual Studio ohne Vorzeichen - wen die C(++?)-Funktion

Code:
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;
}
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.

Gruß

Delphi-Laie
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.106 Beiträge
 
Delphi 12 Athens
 
#4

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 13:34
weil dieser zitierte Wert negativ wird und das Minuszeichen nicht beseitigt werden kann, und zwar auch nicht mit dem Datentyp UInt64 (in Delphi 7)
Da hast du denke ich nicht im Debugger nachgeschaut. Wenn du einen UInt64 Wert an IntToStr fütterst, bekommst du in der Tat negative Werte, da der Wert in Int64 konvertiert wird. Wenn du aber UIntToStr benutzt, funktioniert es. Und im Debugger sehen die Werte auch richtig aus...

Was hältst Du von dieser Idee?
Warum nicht wie in der Vorlage?
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;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#5

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 14:07
Warum nicht wie in der Vorlage?
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;
Weil das halt mangels UInt64 nicht mit Delphi 4,5,6 zusammen spielt? Deshalb kann auch kein UIntToStr benutzt werden, weil es das damals auch nicht gab...
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#6

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 12:03
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.693 Beiträge
 
Delphi 12 Athens
 
#7

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 14:14
Zitat:
Delphi 7
Ich weiß leider nicht in welchen Versionen, aber ich glaub es war irgendwo zwischen 2005 und XE4,
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 14:45
Was hältst Du von dieser Idee?
Sehr viel, denn sie ist die Lösung meines Problemes. Ich hatte die Hoffnung schon aufgegeben. Ich hatte einfach 1:1 von der Vorlage übernommen und die Bedingungen so formuliert:

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).
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 15:02
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).
Signed/Unsigned ist halt nur eine Darstellungssache. Wenn du mit unsigned int rechnest, aber am Ende das Ergebnis einem signed int zuweist, dann kann es halt passieren, dass das MSB als Vorzeichen (fehl-)interpretiert wird. Unter Umständen wird der Wert sogar noch sign-extended.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:03 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