Negativen Wert in Hexadezimal oder Binär umwandeln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von Nixsager »

Hi

Mit Hilfe von http://www.it-academy.cc/article/1369/VB:+Dezimalzahl+in+Binaerzahl+umrechnen.html, http://de.wikihow.com/Bin%C3%A4rzahlen-in-Dezimalzahlen-umwandeln und http://de.wikihow.com/Zahlen-vom-Dezimalsystem-in-das-Hexadezimalsystem-umwandeln habe ich mir einen Code geschrieben der eine Dezimalzahl in eine Hexadezimalzahl oder einen binären Code umwandelt.

Code: Alles auswählen

 
   DevResultValueTemp := (DecValue Div (2 oder 16));
   ModResultValueTemp := (DecValue Mod (2 oder 16));
   DecValue := DevResultValueTemp;
 

Der Code läuft in einer Schleife solange wie die Variabel ModResultValueTemp nicht den Wert 0 hat.
Bei positiven Werten funktioniert das auch, nur bei negativen Werten erhalten ich nicht das erwünschte Ergebnis.
Die Variabeln sind alles Int32-Variabeln.

Wie bekomme ich es hin, das der Wert -1 als $FFFFFFFF oder 11111111111111111111111111111111 bzw. die negativen Werte ohne eine fremde Funktion/Procedur entsprechend ausgegeben werden?

Gruß vom Nixsager
Zuletzt geändert von Nixsager am Di 11. Okt 2016, 11:58, insgesamt 1-mal geändert.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von compmgmt »

Code: Alles auswählen

uses
sysutils;
...
IntToHex(-1, 2); // wird "FFFFFFFF" als String ausgeben


Code: Alles auswählen

uses
strutils;
...
IntToBin(-1, 32); // wird 32-mal "1" als String ausgeben


WICHTIG: Der zweite Parameter gibt Bei IntToHex die MINDESTANZAHL an Zeichen an, bei IntToBin die EXAKTE Anzahl an ausgebeben Zeichen!
Zuletzt geändert von compmgmt am Di 11. Okt 2016, 12:03, insgesamt 3-mal geändert.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)


Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von Nixsager »

Ich will das ganze selbst in einer Routine lösen ohne eine fremde Funktion/Prozedur. Denn auf einem System wo die Funktion/Prozedur nicht zur verfügung steht kann ich sie nicht nutzen, bzw. will sie selber schreiben.
Wie gesagt, IntToHex bzw. IntToBin habe ich ja, aber leider mit der Beschränkung auf positiven Werten.

P.S.
Programmieren ist immer eine Übung. ;)
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von theo »

Ich verstehe irgendwie dein Problem nicht.
Auf welchem System sollte das denn nicht zur Verfügung stehen?

Den Quellcode zu IntToHex findest du in sysstr.inc, der für intToBin in strutils.

Wenn du es selber heraustüfteln willst, warum fragst du dann? :wink:

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von Nixsager »

theo hat geschrieben:Wenn du es selber heraustüfteln willst, warum fragst du dann? :wink:

:roll:
Steht doch alles im ersten Post. Ich will eine eigene Funktion/Prozedur bauen, und brauche Hilfe bei meinem Problem.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von theo »

Nixsager hat geschrieben:
theo hat geschrieben:Wenn du es selber heraustüfteln willst, warum fragst du dann? :wink:

:roll:
Steht doch alles im ersten Post. Ich will eine eigene Funktion/Prozedur bauen, und brauche Hilfe bei meinem Problem.

Klingt eher nach müssen als nach wollen. :wink: Hausaufgabe?

Ich sehe ja deinen Code nicht. Versuch doch mal mit einem vorzeichenlosen Typen zu arbeiten. Z.B. LongWord.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von Nixsager »

Müssen und wollen.
Ich will meine eigene Funktion/Prozedur, deswegen muss ich sie selber schreiben. Denn so lernen ich das Programmieren auch besser. Man wächst mit seinen Aufgaben.

Die Idee mit dem nächstgrößeren Datentyp ist schlecht. Was ist wenn man schon den Größten schon nutzt hat?
Den Quellcode von FPC habe ich schon gesehen. Aber ich will ja meinen verbessern.
Zuletzt geändert von Nixsager am Di 11. Okt 2016, 21:43, insgesamt 2-mal geändert.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

c18x37
Beiträge: 5
Registriert: Mo 23. Nov 2015, 12:57

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von c18x37 »

Nixsager hat geschrieben:Steht doch alles im ersten Post. Ich will eine eigene Funktion/Prozedur bauen, und brauche Hilfe bei meinem Problem.


Du solltest vorher von DecValue das 2-Komplement erstellen (https://de.wikipedia.org/wiki/Zweierkomplement)

z.B.

Code: Alles auswählen

type
    TConvert = record
        case integer of
            0: (integer: Integer);
            1: (cardinal: DWord);
   end;
 
procedure Beispiel;
var zahl : TConvert;
     DecValue: Cardinal;
begin
    zahl.integer := -1;
   DecValue := zahl.Cardinal;
end;


Ich weiß, ist nicht schön so eine Typconvertierung, aber sehr schnell und es sollen ja nur 32bit Werte verarbeitet werden.

Christoph

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von mse »

Arbeite mit Cardinal statt mit Integer.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von theo »

Nixsager hat geschrieben:Die Idee mit dem nächstgrößeren Datentyp ist schlecht. Was ist wenn man schon den Größten schon nutzt hat?


Longword ist nicht größer sondern vorzeichenlos. Cardinal = Longword = DWord. Zur Zt. alles das Gleiche.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von Nixsager »

Das hängt vom System ab. Mein größter ist Int32.
Damit es einfacher wird, anstatt Int32 nimmt Int8. Die Bregrenzung liegt somit bei 8 Bit.

Ich will halt innerhalb dieser Grenze bleiben.
Zuletzt geändert von Nixsager am Di 11. Okt 2016, 14:01, insgesamt 1-mal geändert.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von theo »

Nixsager hat geschrieben:Das hängt vom System ab. Mein größter ist Int32.
Damit es einfacher wird, anstatt Int32 nimmt Int8. Die Bregrenzung liegt somit bei 8 Bit.


Ein LongWord ist immer 32bit genau wie dein int32 (LongInt). Wo ist das Problem?

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von Nixsager »

Uint32 bring mir nichts, weil es vorzeichenlos ist, und ich nur Int32 zur verfügung habe.

theo hat geschrieben:Wo ist das Problem?

Das Problem steht im ersten Post.

@c18x37
Danke für den Wiki-Link! Das scheint wohl, als könnte es mich weiter bringen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Negativen Wert in Hexadezimal oder Binär umwandeln

Beitrag von mse »

Wenn ich dich richtig verstehe, möchtest du die Bits von 2-er Komplementzahlen (=Integer) in sedezimaler Notation (=Hex) anzeigen. -> interpretiere die Integer Ausgangszahl als Cardinal und wandle die Cardinalzahl z.B. mit den Funktionen

Code: Alles auswählen

 
const
 charhex: array[0..15] of char =
          ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
 charhexlower: array[0..15] of char =
          ('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
[...]
function valtohex(const avalue: byte): string;
begin
 setlength(result,2);
 pchar(pointer(result))^:= charhexlower[avalue shr 4];
 pchar(pchar(pointer(result))+1)^:= charhexlower[avalue and $f];
end;
 
function valtohex(const avalue: word): string;
begin
 setlength(result,4);
 pchar(pointer(result))^:= charhexlower[avalue shr 12];
 pchar(pchar(pointer(result))+1)^:= charhexlower[(avalue shr 8) and $f];
 pchar(pchar(pointer(result))+2)^:= charhexlower[(avalue shr 4) and $f];
 pchar(pchar(pointer(result))+3)^:= charhexlower[avalue and $f];
end;
 
function valtohex(const avalue: longword): string;
begin
 setlength(result,8);
 pchar(pointer(result))^:= charhexlower[avalue shr 28];
 pchar(pchar(pointer(result))+1)^:= charhexlower[(avalue shr 24) and $f];
 pchar(pchar(pointer(result))+2)^:= charhexlower[(avalue shr 20) and $f];
 pchar(pchar(pointer(result))+3)^:= charhexlower[(avalue shr 16) and $f];
 pchar(pchar(pointer(result))+4)^:= charhexlower[(avalue shr 12) and $f];
 pchar(pchar(pointer(result))+5)^:= charhexlower[(avalue shr 8) and $f];
 pchar(pchar(pointer(result))+6)^:= charhexlower[(avalue shr 4) and $f];
 pchar(pchar(pointer(result))+7)^:= charhexlower[avalue and $f];
end;
 
function valtohex(const avalue: qword): string;
begin
 result:= valtohex(avalue shr 32)+valtohex(avalue);
end;
 

von hier:
https://gitlab.com/mseide-msegui/mseide ... matstr.pas

Antworten