Lothar: Zahlzeichen

Hallo,
ich hoffe, die Frage ist nicht zu dumm. Ich bin kein Programmierer, deshalb verzeiht mir bitte die etwas sonderbare Frage.

Nehmen wir an, ich habe in einer Variablen den Wert 2 gespeichert. Dann ist der numerische Wert 2 im Speicher hinterlegt. Es wird also nicht der Codepoint einer Kodierung für das Zahlzeichen 2 hinterlegt, sondern der abstrakte, numerische Wert 2.  Sehe ich das soweit richtig?

int a = 2;
=> hier wird gespeichert, dass es sich um eine numerische Information handelt. Die numerische Wertigkeit dieser Information ist 2.

Wenn ich also auf dem Bildschirm das Zeichen 2 sehe, ist der Wert 2 im Prinzip nur die abstrakte Idee, oder besser, semantische Information hinter diesem. Das Zahlzeichen 2 selbst hat mit dem numerischen Wert 2 erstmal nicht das geringste zu tun. Das Zahlzeichen 2 könnte also auch den numerischen Wert 3 hinterlegt haben (ganz unabhängig von einer konkreten Implementierung, zum Beispiel als Entität in einer Testwelt). Gut, das ist jetzt ein bisschen sehr abstrakt, aber nur mal grundsätzlich. Liege ich hier noch ebenfalls richtig?

Ich möchte nun das Zeichen 2 drucken, d.h. auf dem Bildschirm ausgeben. Oder anders, ich möchte den Codepoint einer entsprechenden Kodierung des Zeichens 2 haben. Wie mache ich das am geschicktesten?

Wäre zum Beispiel eine Hash-Tabelle das richtige Werkzeug dazu?
D.h., ich mappe konkrete numerische Werte mit den entsprechenden Codepoints der Zeichen in meiner Wunschkodierung?

Hintergrund: mir liegen einige -aus Berechnungen erhobene- numerische Werte vor, die ich auf dem Bildschirm ausgeben möchte. Die zu nutzende Sprache unterstützt nur das Ausdrucken über die direkte Angabe eines Codepoints.

print_r(3); // würde also nicht funktionieren, bzw. würde ein ETX drucken
print_r(51); // wäre richtig, um das Zahlzeichen 3 auszudrucken

danke für etwaige Erhellungen!
Lothar

  1. Hi,

    soweit ich dich richtig verstehe, hast du alles richtig verstanden :-)

    Könntest du nicht einfach

    int a = 3  
    print_r(48 + a)
    

    ausgeben?

    ~dave

    1. Natürlich nur für Zahlen kleiner 10.

      1. Natürlich nur für Zahlen kleiner 10.

        Genau, größere Zahlen muss man dann sicherlich zusammensetzen. Dass heisst, die Zahl 123 besteht aus drei Zahlzeichen, von denen jeweils der Codepoint ermittelt werden muss.

        1. Hi,

          Genau, größere Zahlen muss man dann sicherlich zusammensetzen. Dass heisst, die Zahl 123 besteht aus drei Zahlzeichen, von denen jeweils der Codepoint ermittelt werden muss.

          Ich weiß nicht ob das jetzt eine Frage ist wie man das denn macht, oder nur dein Gedankengang aufgeschrieben?
          Ist klar wie das mit Zahlen > 9 dann geht?

          ~dave

    2. Hallo,

      soweit ich dich richtig verstehe, hast du alles richtig verstanden :-)

      Könntest du nicht einfach

      int a = 3

      print_r(48 + a)

      
      >   
      > ausgeben?  
      >   
        
      das ging ja schnell! Ja, das könnte ich tun. Aber was ist, wenn ich ein kaufmännisches Und (&) drucken möchte? Dann wäre der fixe Wert von 48 ja nicht richtig, oder? Dann müsste ich vorher unterscheiden, ob es sich um einen numerischen Wert handelt oder eine String-Information, vermute ich.
      
      1. Hi,

        Dann müsste ich vorher unterscheiden, ob es sich um einen numerischen Wert handelt oder eine String-Information, vermute ich.

        Ich glaube nicht dass du in der Variable

        int a = …

        jemals ein kaufmännisches & finden wirst.
        Ist schließlich als Integer definiert.
        Die Unterscheidung ob numerischer Wert oder String-Information ist also längst gefallen.

        ~dave

  2. Hi,

    Nehmen wir an, ich habe in einer Variablen den Wert 2 gespeichert. Dann ist der numerische Wert 2 im Speicher hinterlegt. Es wird also nicht der Codepoint einer Kodierung für das Zahlzeichen 2 hinterlegt, sondern der abstrakte, numerische Wert 2.  Sehe ich das soweit richtig?

    ja, wobei man hier schon einwenden müsste, dass es verschiedene Methoden gibt, den Zahlenwert 2 darzustellen.

    int a = 2;
    => hier wird gespeichert, dass es sich um eine numerische Information handelt. Die numerische Wertigkeit dieser Information ist 2.

    Nein. Ja.
    Wenn wir von klassischen Compilersprachen wie etwa C ausgehen, dann wird keine Information über die Art der Information gespeichert; die ergibt sich daraus, wie die gespeicherte Information beim Auslesen interpretiert wird.

    Wenn ich also auf dem Bildschirm das Zeichen 2 sehe, ist der Wert 2 im Prinzip nur die abstrakte Idee, oder besser, semantische Information hinter diesem. Das Zahlzeichen 2 selbst hat mit dem numerischen Wert 2 erstmal nicht das geringste zu tun. Das Zahlzeichen 2 könnte also auch den numerischen Wert 3 hinterlegt haben (ganz unabhängig von einer konkreten Implementierung, zum Beispiel als Entität in einer Testwelt). Gut, das ist jetzt ein bisschen sehr abstrakt, aber nur mal grundsätzlich. Liege ich hier noch ebenfalls richtig?

    Ja, mit der abstrakten theoretischen Betrachtung auf jeden Fall.

    Ich möchte nun das Zeichen 2 drucken, d.h. auf dem Bildschirm ausgeben. Oder anders, ich möchte den Codepoint einer entsprechenden Kodierung des Zeichens 2 haben. Wie mache ich das am geschicktesten?

    Indem du eine möglichst weit verbreitete Zuordnungsvorschrift verwendest, die einem bestimmten numerischen Wert ein Zeichen zuordnet. Der kleinste gemeinsame Nenner dieser Zuordnungsvorschriften ist vermutlich der ASCII-Code. Der ordnet beispielsweise den Zahlencodes 48..57 (hexadezimal: 0x30..0x39) die Ziffern 0..9 als druckbare Zeichen zu.

    Hilft dir das schon weiter, oder möchtest du weiter ins Detail gehen?

    So long,
     Martin

    --
    Der Bäcker schlägt die Fliegen tot
    Und macht daraus Rosinenbrot.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo Der Martin,

      Nehmen wir an, ich habe in einer Variablen den Wert 2 gespeichert. Dann ist der numerische Wert 2 im Speicher hinterlegt. Es wird also nicht der Codepoint einer Kodierung für das Zahlzeichen 2 hinterlegt, sondern der abstrakte, numerische Wert 2.  Sehe ich das soweit richtig?

      ja, wobei man hier schon einwenden müsste, dass es verschiedene Methoden gibt, den Zahlenwert 2 darzustellen.

      int a = 2;
      => hier wird gespeichert, dass es sich um eine numerische Information handelt. Die numerische Wertigkeit dieser Information ist 2.

      Nein. Ja.
      Wenn wir von klassischen Compilersprachen wie etwa C ausgehen, dann wird keine Information über die Art der Information gespeichert; die ergibt sich daraus, wie die gespeicherte Information beim Auslesen interpretiert wird.

      das verstehe ich noch nicht ganz. Oder eigentlich verstehe ich schon, aber mir fehlt noch der letzte Schritt zur Erkenntnis. Könntest du mir aufzeigen/erklären, wie in diesem Falle

      a) der numerische Wert 2
      und
      b) das Zahlzeichen 2 gespeichert wird?

      Ich möchte nun das Zeichen 2 drucken, d.h. auf dem Bildschirm ausgeben. Oder anders, ich möchte den Codepoint einer entsprechenden Kodierung des Zeichens 2 haben. Wie mache ich das am geschicktesten?

      Indem du eine möglichst weit verbreitete Zuordnungsvorschrift verwendest, die einem bestimmten numerischen Wert ein Zeichen zuordnet. Der kleinste gemeinsame Nenner dieser Zuordnungsvorschriften ist vermutlich der ASCII-Code. Der ordnet beispielsweise den Zahlencodes 48..57 (hexadezimal: 0x30..0x39) die Ziffern 0..9 als druckbare Zeichen zu.

      Hilft dir das schon weiter, oder möchtest du weiter ins Detail gehen?

      Das hilft mir auf alle Fälle weiter. Ich denke, ich weiß jetzt, wie ich das angehen kann. Das Problem näher zu beschreiben, fällt mir etwas schwer. Ich denke, ich arbeite daran, und wenn ich nicht weiterkomme, melde ich mich nochmal.

      Danke für deine Hilfe
      Lothar

      1. n'Abend,

        Wenn wir von klassischen Compilersprachen wie etwa C ausgehen, dann wird keine Information über die Art der Information gespeichert; die ergibt sich daraus, wie die gespeicherte Information beim Auslesen interpretiert wird.
        das verstehe ich noch nicht ganz. Oder eigentlich verstehe ich schon, aber mir fehlt noch der letzte Schritt zur Erkenntnis. Könntest du mir aufzeigen/erklären, wie in diesem Falle

        a) der numerische Wert 2
        und
        b) das Zahlzeichen 2 gespeichert wird?

        ich gehe mal von einigen heutzutage üblichen Annahmen aus. Beispielsweise, dass Ganzzahlen als 32bit-Werte gespeichert werden, und dass du tatsächlich den Wert 2 als Ganzzahl meinst (der Wert 2.0 als Fließkommazahl wird nämlich wieder ganz anders dargestellt).

        Die binäre Darstellung der Zahl 2 ist ...00010, wobei die Punkte andeuten sollen, dass man beliebig viele führende Nullen notieren könnte, ohne den Zahlenwert zu verändern. Wenn wir also nun den Wert 2 als Zahl speichern, aber dabei 32 Bits vorsehen, hätten wir die binäre Ziffernwurst 00000000'00000000'00000000'00000010, wobei die Apostrophe nur der Gliederung dienen. Diese Sequenz von 32 Bits im Speicher oder in einem CPU-Register repräsentiert nun den Zahlenwert 2.

        Das Symbol '2' dagegen ist nach dem ASCII-Code dem Zahlenwert 50 (hex: 0x32) zugeordnet und wird üblicherweise mit 7 oder 8 Bits dargestellt. Es wird also im Speicher als Bitsequenz 00110010 abgelegt.

        So long,
         Martin

        --
        Alleine sind wir stark ...
        gemeinsam sind wir unausstehlich!
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. hi,

    [..] ich möchte den Codepoint einer entsprechenden Kodierung des Zeichens 2 haben. Wie mache ich das am geschicktesten?

    Der Codepoint ist nicht abhängig von einer entsprechenden Kodierung. Jedes Zeichen hat einen eindeutigen und von der Kodierung unabhängigen Codepoint.

    Hotti

  4. @@Lothar:

    nuqneH

    Nehmen wir an, ich habe in einer Variablen den Wert 2 gespeichert. Dann ist der numerische Wert 2 im Speicher hinterlegt. Es wird also nicht der Codepoint einer Kodierung für das Zahlzeichen 2 hinterlegt,

    Was du „Zahlzeichen“ nennst, heißt „Ziffer“.

    sondern der abstrakte, numerische Wert 2.  Sehe ich das soweit richtig?

    Ja. Zahlen werden im Computer binär gespeichert (42 als 101010), nicht als Sequenz ihrer Dezimalziffern (BCD, '42' als '4' '2').

    (Dass die Binärdarstellung auch als Sequenz der Hexadezimaldiffern aufgefasst werden kann, verwirrt jetzt, oder?)

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. gudn tach!

      Nehmen wir an, ich habe in einer Variablen den Wert 2 gespeichert. Dann ist der numerische Wert 2 im Speicher hinterlegt. Es wird also nicht der Codepoint einer Kodierung für das Zahlzeichen 2 hinterlegt,

      Was du „Zahlzeichen“ nennst, heißt „Ziffer“.

      folge mal deinem link. "ziffer" ist mittlerweile bloss ein redir auf "zahlzeichen". ;-)

      auf die wikipedia zu verlinken ist jedoch in diesem bereich ohnehin schon seit jahren leider nicht sinnvoll. die artikel zu "ziffer", "zahl", "zahlzeichen" etc. sind derzeit was die begriffsverwendung betrifft in teilen zu normativ und in teilen auch einfach falsch. auf den zugehoerigen talk pages sind km-lange diskussionen dazu zu finden. der derzeit einzige, der sie wirklich sinnvoll ueberarbeiten koennte, ein philologe, hat offenbar leider keine zeit und wird zusaetzlich von einigen anderen usern gebremst. nun ja, abwarten.

      prost
      seth

  5. Hallo!

    Deine Überlegungen sind prinzipiell richtig.

    print_r(3); // würde also nicht funktionieren, bzw. würde ein ETX drucken
    print_r(51); // wäre richtig, um das Zahlzeichen 3 auszudrucken

    Da aber in jeder mir bekannten Kodierung die Zeichen '0' bis '9' in der richtigen Reihenfolge hintereinander angeordnet sind, sind Überlegungen wie Hashtabellen viel zu umständlich.
    Ich denke, dass eine simple Addition völlig ausreicht, d.h.
    print_r(myNumber + 48);
    sollte das Problem lösen.

    Viele Grüße,
    Alexander