Zahlzeichen
Lothar
- programmiertechnik
0 dave0 Der Martin0 Lothar
0 hotti0 Gunnar Bittersmann0 Alex
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
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
Natürlich nur für Zahlen kleiner 10.
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.
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
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.
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
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
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
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 Fallea) 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
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
@@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'
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
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