Hallo Besucher, der Thread wurde 7,8k mal aufgerufen und enthält 29 Antworten

letzter Beitrag von Zirias/Excess am

Zahl in String umwandeln


  • Eigentlich immer 0-9 in einzelne Bytes. Einfacher geht's ja nicht. Wenn die Scores o. ä. direkt als Chars geprinted werden sollen ginge das natürlich. Ist aber ja auch nicht die Regel.


    Versteh ich jetzt nicht.

  • Er hat sich ungenau ausgedrückt, er meinte für jede Ziffer ein Byte und dafür braucht man zehn Chars für die darzustellen.


    Ok. Und wenn man das so macht, wie rechnest dann was hinzu?


    Nachtrag:
    Hab gerade festgestellt, das bei meiner Methode keine Null übergeben werden darf. :(
    Dann stürzt das Programm ab, wenn ich die führenden Nullen wegmache. Da muß also zusätzlich noch ne Abfrage mit rein.

  • Hab gerade festgestellt, das bei meiner Methode keine Null übergeben werden darf. :(
    Dann stürzt das Programm ab, wenn ich die führenden Nullen wegmache. Da muß also zusätzlich noch ne Abfrage mit rein.

    Es könnte sein, daß Du eine Stelle zuviel untersuchst. Tausch doch mal

    Code
    1. ld b, 5

    gegen

    Code
    1. ld b, 4

    aus und kopiere den String nicht um, sondern übergib einfach die verschobene Stringadresse an die Ausgaberoutine.
    Die Addition bei Ziffern funktioniert ungefähr so:

    Bei dieser Methode kann man beliebig viele Stellen verwenden und damit auch einfach Zahlen erzeugen > 65535.

  • Spannender ist HEX nach DEC und umgekehrt, aber dafür findet man Schnipsel auf Codebase :)


    Die Ausgabe HEX in DEC ist zum Glück ja auch eher die Ausnahme.



    Wenn sogar Graham diesen Fehler macht, ist vermutlich eh Hopfen und Malz verloren, aber ich sags trotzdem: Die verlinkte Routine konvertiert nicht von hexadezimal zu dezimal, sondern von Integer zu dezimal.
    Mit "Hexadezimal" ist eine Zahlendarstellung mit sechzehn verschiedenen Ziffern gemeint. Aus naheliegenden Gründen werden Register- und Speicherinhalte von Rechnern, deren Wortbreite durch acht teilbar ist, gern in diesem Format angezeigt. Aber solange keine Anzeige erfolgt, sind die Inhalte weder hexadezimal noch dezimal noch sexagesimal, echt jetz.

  • Zitat von »Hexworx«


    Eigentlich immer 0-9 in einzelne Bytes. Einfacher geht's ja nicht. Wenn die Scores o. ä. direkt als Chars geprinted werden sollen ginge das natürlich. Ist aber ja auch nicht die Regel.


    Versteh ich jetzt nicht.


    Das war ja bezogen auf ACE's Aussage, direkt in PETSCII zu zählen, also von #$30 bis #$39. Macht natürlich nur Sinn, wenn man den Score auch als 8x8 Chars darstellen will. Wenn ich da Tiles oder Sprites habe, würde ich wohl eher von #$00 bis #$09 zählen (oder vielleicht auch noch ganz anders; je nachdem wie es halt besser zur Ausgaberoutine passt).


    Er hat sich ungenau ausgedrückt, er meinte für jede Ziffer ein Byte und dafür braucht man zehn Chars für die darzustellen.


    Jein. Gemeint war ja z. B. sechsstelliger Score -> sechs Bytes für sechs Digits.

  • Es könnte sein, daß Du eine Stelle zuviel untersuchst. Tausch doch mal

    Code
    1. ld b, 5

    gegen

    Code
    1. ld b, 4

    aus und kopiere den String nicht um, sondern übergib einfach die verschobene Stringadresse an die Ausgaberoutine.


    Also von 5 auf 4 bringt nix, außer das bei einer mehrstelligen Zahl eine Stelle fehlt. Oder ich bekomme lustige Bilder auf dem Schirm. :)


    Das mit dem Umkopieren, das hast Du recht. Das werde ich nachher mal ändern.



    Nachtrag:
    Geht doch mit der 4, jetzt wo ich das Umkopieren weglasse. :thumbsup:

  • Die verlinkte Routine konvertiert nicht von hexadezimal zu dezimal, sondern von Integer zu dezimal.
    Mit "Hexadezimal" ist eine Zahlendarstellung mit sechzehn verschiedenen Ziffern gemeint. Aus naheliegenden Gründen werden Register- und Speicherinhalte von Rechnern, deren Wortbreite durch acht teilbar ist, gern in diesem Format angezeigt. Aber solange keine Anzeige erfolgt, sind die Inhalte weder hexadezimal noch dezimal noch sexagesimal, echt jetz.


    Naja, man muss leider ein wenig rechnen, damit man eine Zahl von Hex/Int in Dezimaldarstellung konvertieren kann. Dafür eignet sich nunmal das Format am besten, mit der die CPU am besten umgehen kann: Integer. Nun muss man vorher nur noch die hexadezimal dargestellte Zahl nach Integer umwandeln, was zum Glück nicht schwer ist. :)

  • Ich zeige hier mal meine 6502 routine, die den double-dabble algorithmus implementiert, ca65 syntax:



    Anpassbar über die beiden Konstanten auf verschiedene Bitbreiten, hier 4 bytes, also 32 bit. Die Ausgabe ist hier rechtsbündig, wenn man das anders will muss der Code ab "nts_scan" angepasst werden.