AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Datentyp "Int64" fehlerhaft?

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

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

Datentyp "Int64" fehlerhaft?

  Alt 18. Jun 2017, 23:56
Delphi-Version: 5
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
Angehängte Dateien
Dateityp: zip Int64-Fehler.zip (149,6 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 00:08
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.

Geändert von Aviator (19. Jun 2017 um 00:18 Uhr) Grund: Schreibfehler korrigiert
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#3

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 08:05
Sorry: Der Wertebereich von Int64 ist -2^63 bis (2^63)-1. (63 = 11 + 32 + 16 + 4)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 08:06
Es gibt auch den Datentyp UInt64, der geht von 0 bis 2^64-1 und kennt keine negativen Zahlen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 08:09
Sorry: Der Wertebereich von Int64 ist -2^63 bis (2^63)-1. (63 = 11 + 32 + 16 + 4)

Da bin ich wohl 2 mal auf der Tastatur ausgerutscht.

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.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 09:01
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.
  Mit Zitat antworten Zitat
Delphi-Laie

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

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 11: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 11:19 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#8

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 11: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
 
#9

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 11: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
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#10

AW: Datentyp "Int64" fehlerhaft?

  Alt 19. Jun 2017, 13: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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:38 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