Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem mit uint64 und inttostr
Boldar - Sa 16.08.08 00:15
Titel: Problem mit uint64 und inttostr
Aus irgendeinem Grund gibt inttostr bei mir bei uint-Werten über 2^32 immer -1 Zurück. Es gibt leider kein inttostr64. Lässt sich dass irgenwie ändern?
wazup - Sa 16.08.08 01:37
Die Funktion
IntToStr wandelt nicht nur
Integer in einen String um sondern auch
Int64 :!:
Delphi-Quelltext
1: 2:
| function IntToStr(Value: Integer): string; function IntToStr(Value: Int64): string; |
jaenicke - Sa 16.08.08 01:56
uint ist aber gar kein Int64... Das ist ein ganzzahliger Wert zwischen 0 und 4294967295. Und das funktioniert bei mir problemlos:
Delphi-Quelltext
1:
| ShowMessage(IntToStr(Uint(4194967295))); |
Das ist 100000000 unter dem maximalen Wert für uint.
Mit Int64 gehen noch viel höhere Werte und auch mit IntToStr.
BenBE - Sa 16.08.08 03:31
@jaenicke: uint = uint32 = DWORD, uint64 != uint32: uint64 = Unsigned Int64 = Kann Delphi nicht über die Standard-Funktionen. Delphi behandelt Int64 IMMER mit Vorzeichen (Also Bit 63). Zahlen bis 2^63-1 sollte er also Problemlos darstellen.
Boldar - Sa 16.08.08 13:48
aber wieso gibt inttostr bei mir für Werte über 2^32-1 dann eins Zurück??
Delete - Sa 16.08.08 14:12
macht doch gar nicht ...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| program Project1; {$APPTYPE CONSOLE}
uses SysUtils;
begin writeln(inttostr(MaxInt)); readln; end. |
zeig doch mal deinem code her... habe meine kristallkugel in der firma ...
Marc. - Sa 16.08.08 14:15
Boldar hat folgendes geschrieben: |
| aber wieso gibt inttostr bei mir für Werte über 2^32-1 dann eins Zurück?? |
Lediglich eins?
| DOH hat folgendes geschrieben: |
| When you increment the last value or decrement the first value of an integer type, the result wraps around the beginning or end of the range. |
Boldar - Sa 16.08.08 14:20
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Function IsPrim(zahl : Integer): boolean; var i: cardinal; begin result := true; If zahl = 1 then begin result := false; exit; end; For i := 2 to Trunc(getsqrt(zahl))+1 do begin If ((zahl mod i) = 0) then begin result := false; exit; end; end; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure parse (a: tedit); var s: string; s1: shortstring; aint : uint64; begin s := a.text; if copy(s, 1, 1)='2' then begin if copy(s, 2, 1)='^' then begin s := copy (s, 3, length (s) -2); s1 := copy(s, 0, pos('-', s)-1); aint := strtoint64(s1); if aint > 62 then begin showmessage ('Zahl ist grösser als 2^62 und damit nicht zulässig'); exit; end; aint := trunc(power (2, aint)); aint := aint -1; s1 := inttostr(aint); showmessage (s1); a.Text := inttostr(aint); end; end;
end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm10.Button14Click(Sender: TObject); var ant: cardinal; begin uinttostr(00); parse (edit4); ant := strtoint(edit4.text); if isprim (ant) then showmessage (edit4.Text + ' ist eine Primzahl!') else showmessage (edit4.Text + ' ist keine Primzahl!')
end; |
Mit dem Code sollen Zahlen in der Form 2^x -1 Auf Primzahlen untersuch werden!
Delete - Sa 16.08.08 14:35
du weisst aber schon... dass 2^32 etwas anderes ist als 2^64... :roll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var s: string; s1: shortstring; aint : uint64; begin s := a.text; if copy(s, 1, 1)='2' then begin if copy(s, 2, 1)='^' then begin s := copy (s, 3, length (s) -2); s1 := copy(s, 0, pos('-', s)-1); aint := strtoint64(s1); if aint > 62 then begin showmessage ('Zahl ist grösser als 2^62 und damit nicht zulässig'); exit; end; aint := trunc(power (2, aint)); |
wirbeldelphi - Sa 16.08.08 15:19
Wenn du Zahlen auf prim untersuchen willst und eh mit großen Zahlen umgehen willst solltest du nach Umsetzungen für den Miller-Rabin-Selfridge oder evtl. auch den Pollard-Rho Algorithmus suchen und auch nicht erst mit int64 rumdoktern sondern gleich auf units zugreifen die riesige Zahlen verarbeiten können. Siehe z.B. BigNum von BenBE.
Ist zwar am Thema inttostr vorbei, schickt dich aber in die richtige Richtung...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!