PC und große Zahlen darstellen?



  • Hi,
    also ich glaube du hast es noch nicht wirklich geblickt.
    Vor allem sollte man nicht alles gleicht überstürzen.
    Lies dir meinen Beitrag von gestern zu deinem Thema:"8 Bits stellen eine Ziffer dar" nochmal durch.
    Danach wird dir vielleicht einiges klar. OK? 😉

    Gruß Red!



  • Red{C++}
    dein beitrag mit 8 bits genau die Geschichte mit dem Asci-Zeichensatz
    in der Tabelle hat der Buchstabe 'A' den Wert 65
    was laut deinem Ansatz mit bits 01000001 darstellen lässt.
    Ich habe eher das Gefühl man hat mich nicht richtig verstanden.

    1. Wie stellt der Rechner generell die Zahlen dar?
    z.B 99999999999999999999999999999999 wird wie dargestellt?
    mit Asci-Zeichensatz oder anders ??
    Sorry aber wie genau soll ich die Frage noch formulieren???



  • Zahlen werder so viel ich weiß nicht mit dem ASCII Zeichendatz sondern eben binär mir dem dualen Zahlensystem im Speicher dargestellt.
    Schreibst du z.B. folgenden Befehl:

    MOV AL,5

    ...sieht das Teilregister AL danach so aus:
    00000101

    Ich hoffe ich habe dir deine FRage beantwortet 😉

    Gruß Red!



  • Tauboga schrieb:

    Wie stellt der Rechner generell die Zahlen dar?
    z.B 99999999999999999999999999999999 wird wie dargestellt?
    mit Asci-Zeichensatz oder anders ??

    Das hängt vom Programm ab.

    Manche Programme verwenden hier den ASCII-Zeichensatz, was aber für Berechnungen nicht die geschickteste Wahl ist. Diese Darstellungsart ist dann z.B. zur Basis 10 oder 16, weil man die noch ganz gut mit ASCII-Zeichen darstellen kann.

    Alternativ wird z.B. die Darstellung zur Basis 256 verwendet. Dann stellt jedes Byte im Speicher eine Ziffer der Zahl dar. So eine Zahl kann man natürlich nicht direkt ausgeben, man muss sie erst in ein lesbares System (z.B. das Dezimalsystem) konvertieren.



  • hi cd9000
    danke für deine Antwort aber könntest du mir bitte hierzu ein Beispiel nennen?

    Alternativ wird z.B. die Darstellung zur Basis 256 verwendet. Dann stellt jedes Byte im Speicher eine Ziffer der Zahl dar. So eine Zahl kann man natürlich nicht direkt ausgeben, man muss sie erst in ein lesbares System (z.B. das Dezimalsystem) konvertieren

    Grüße



  • ich blick immer noch nicht durch die Frage durch ;).
    Unter "wie stellt der PC/Rechner die zahlen dar" kann man verstehen:
    wie sehen die im speicher/in der CPU aus; wie werden diese in einem Programm
    dargestellt oder auch: wie wird das ganze auf den Bildschirm gebracht.
    Wie schon erwähnt ist es grundsätzlich die binäre darstellung - damit wird gerechnet.

    Der CPU ists egal ob zahlen oder Buchstaben - intern sind es nur dualzahlen.
    Die CPU ist außerdem ganz dumm: sie versteht nur sehr wenige befehle.

    Normalerweise sieht so ein CPU befehl so aus:
    Operand,Adresse; Alles natürlich nur zahlen, Operand sagt der CPU dabei was gleich getan werden soll.

    Ein Operand ist eine bestimmte Zahl(CPU-Hersteller/Entwickler abhängig - er

    setzt sie einfach fest). zB 00001 steht für Addieren,00010 für Subtrahieren,
    usw. Im prinzip kommt man mit etwa 10 Intruktionen aus (auch das komplexeste C++
    Programm läst sich damit umsetzen 😉 ).

    Im Speicher stehen nur abfolgen von 0 und 1, weil das ganze auf einem
    Schaltersystem basiert - AN (1) oder AUS (0). Soll also gerechnet werden, muss
    der Programmierer (oder sein compiler) wissen was wofür steht - ob die Zahlen
    jetzt CPU-Befehle sind, Zahlen mit denen gerechnet werden soll oder die
    ausgegeben werden sollen.Alles was man auf dem bildschirm sieht sind bilder.Die
    Zahlen und buchstaben werden auch mithilfe von bildern dargestellt.Will man als
    programmierer 1+998 berechnen dann schreibt man ein Programm und es sieht im
    Speicher in etwa so aus:

    1011100000000001000000000000000000000000
    10111100110000000110000000000000000

    die erste zeile ist: lade eine 1 in den EAX register
    die zweite: addiere eine 998 dazu

    da man sich als mensch das nicht merken kann, lasse ich es mir lieber in HEX darstellen:

    b8 01000000000
    05 e6030000000

    wohlgemerkt die zweite darstellung ist nur für mich als (superlowlevel) Programmierer da.

    Will der Programmierer das Ergebnis ausgeben, gibt es eigentlich mehrere möglichkeiten:
    man kann z.b mit einem Lämpchen blinken und der Benutzer soll mitzählen 🙄 oder man kann es als Morsezeichen Beepen oder auf den Bildschirm
    bringen.
    Jetzt steht man vor der Wahl: wie gibt man das aus - dual oder dezimal
    oder octal oder hexadezimal?
    Die meisten Menschen sind an das dezimale System
    gewohnt deshalb wäre es nicht schlecht das ergebnis dezimal darzustellen.

    Wie kann man also zahlen auf dem Bildschirm ausgeben? AM einfachsten natürlich als Bilder - für eine Zahl ein Bild (man erinnere sich: ein Bild besteht aus
    pixeln, eine Bilddatei beschreibt oder hält fest felche koordinaten und Farbe
    jedes Pixel hat: z.B 0001 0001 für Pixel1 0001 00010 für Pixel 2 0001 00011 für
    Pixel 3 usw.)
    Wie jetzt die Bilder auf den schirm in wirklichkeit kommen wäre
    etwas zu komplex zu erklären 😃 aber vereinfacht gesagt: es werden Infos an die
    Grafikkarte geschickt - Pixel für Pixel und die schickt das an den Monitor
    weiter und der stellt es dar)

    Also: man kann für jede mögliche zahl ein Bild speichern (wäre umständlich ;))
    oder man kann (für Dezimalsystem) 10 Bilder machen).
    Damit kein Programmierer bzw. Compilerhersteller immer was eigenes entwickeln muss, gibt es standards:
    ASCII ist da nur ein Standard dafür, es gibt noch weitere "Übereinkommen" wie
    ein zeichensatz dargestellt werden kann. Aber im Prinzip kann man ASCII als eine
    Tabelle vorstellen die für jedes Zeichen ein Bild hat bzw auf ein Bild zeigt (an
    andere User: es ist eine starke vereinfachung 😉 )

    Und da ASCII noch jede Menge andere Zeichen enthält sind die Bilder für die dezimalzahlen an der 48 Stelle gelandet.

    Damit man eine Zahl wie 1111100111 (999) auf den Bildschirm bringen kann, müsste man das ganze umrechnen (denn zur erinnerung: zahlendarstellung in binär: http://de.wikipedia.org/wiki/Dualsystem)
    da die ASCII Tabelle 256 Zeichen enthält und somit sich durch 8-bits (also einem
    Byte - die kleinste Eincheit auf die man sich geeinigt hat, außerdem sollte man
    wissen dass eine CPU den Speicher nicht Bitweise ansprechen kann (also jedes
    einzelne Bit auslesen) sondern in Blöcken: Byte oder Doppelbyte oder 4-Byte
    weise)) vollständig ansprechen lässt, müssen wir aus unserer 1111100111 drei
    solche Bytes machen damit wir 999 ausgeben können.Wir bzw CPU rechnen also
    erstmal in die dezimale darstellung um und haben dann drei Werte im Speicher
    vorliegen:

    00001001
    00001001
    00001001

    Jetzt muss der Programmierer noch den letzten schliff geben: die Bilder für die
    Ziffern sind in der ASCII tabelle auf der 48 anfangen, muss er noch jeweils zu
    jedem Wert 48 dazurechnen.

    00111001
    00111001
    00111001

    Jetzt ist die Zahl bereit zur ausgabe.

    Zur weiterem Verständniss: Der ASCII Satz, also die Bilder, werden vorher
    natürlich in den Speicher geladen.Man stelle sich einfach eine Datei vor in
    welcher 256 bilder sind.

    /////DATEI\\\\\\
    01001010110101010010101 <=Pixelinfos für bild 1
    01110001011111010101010 <=Pixelinfos für bild 2
    ....
    01111001111010111011100 <=Pixelinfos für bild 256
    

    jetzt möchte man eine Zahl ausgeben: dafür lässt der Programmierer die CPU
    einfach einen Speicherblock auslesen (sagen wir mal wir möchten die 9
    darstellen, also ist es der 9 block) und schickt die Information an die
    Grafikkarte.Diese zeichnet dann dem entsprechen pixel für Pixel.

    Wenn man jetzt einen Text ausgeben will: "hallo", dann kann man
    das entweder als Bild machen (also vorher malen, abspeichern und dann zeichnen lassen)
    oder man macht es sich einfacher und speichert dafür die Zahlen für die ASCII tabelle:
    im Speicher als abfolge von bits ab:
    (bin jetzt zu faul umzurechnen 😉 ) immer 8-bits-ein Byte, und zwar
    104 97 108 108 111 (wie gesagt bin jetzt zu faul nach binär umzurechnen)
    jede Zahl ist die "nummer" des bildes im ASCII.
    So "setzt" man sich seinen Text aus bildchen zusammen. Für die CPU ist es nur eine Zahl.

    Der Programmierer muss natürlich dazu auch wissen WO im Speicher diese Information(bzw dieses Bild vorliegt) und auch die CPU anweisen bzw. die Speicherstelle nennen.
    Nichts geschieht ohne ihn... er gibt die Anweisungen und hält die Fäden in der Hand 😃

    Natürlich muss der moderne Programmierer nichts dergleichen machen.
    Sowas übernehmen der Compiler, irgendwelche libs und nicht zuletzt das OS.
    Aber irgendjemand hat sich mal die Mühe gemacht es zu entwickeln.

    PS: Hehe, jetzt hab ich dich endgültig verwirrt :xmas1:

    PPS: für andere User: ja,die Grafikkarte hat i.d. Regel auch schon einen Zeichensatz im ROM und ja, nicht alles ist detailgetreu aber ich denke dass ich da keine gröberen Fehler hab, Richtigstellungen sind jedoch immer herzlich willkommen.



  • Zu beachten ist das es auch negative Zahlen gibt und dort die 2er Komplementbildung zum tragen kommt - also aufpassen ob man es mit vorzeichenlos oder vorzeichenbehafteten Dualzahl zu tun hat

    im BCD-Code läuft es so wie du es beschrieben hast - dort wird jede Zahl einzeln als Dualzahl dargestellt
    1436 wird im BCD Code, gepackt wie folgt dargestellt:
    0001 0100 0011 0110



  • CDW
    ich möchte mich persönlich für deinen so ausührlichen und fachkundigen
    Beitrag bedanken.

    Grüße
    Tauboga



  • CDW
    ich hätte eine kleine Frage:

    1011100000000001000000000000000000000000 
    10111100110000000110000000000000000 
    die erste zeile ist: lade eine 1 in den EAX register 
    die zweite: addiere eine 998 dazu
    

    Wie bedeutet 1011100000000001000000000000000000000000
    lade eine 1 in den EAX register

    10111100110000000110000000000000000
    Wo ist hier die Zahl 998 ????
    10111100110000000110000000000000000 ist als
    Dezimalzahl 25333792768

    Grüße



  • dieses Beispiel da oben hab ich mal schnell getippt und übersetzt 😉
    dabei darf man die zahl natürlich nicht komplett nehmen:
    1011100000000001000000000000000000000000

    um es besser zu erkennen mache ich mal da leerzeichen rein:

    10111000 00000001 00000000 00000000 00000000
    

    (um die übersicht zu erhöhen werde ich mal in HEX posten)
    lade eine 1 in EAX:

    mov eax,1
    b8 01000000
    

    dabei ist B8 (also 10111000) die Anweisung für den Prozessor die nächstfolgende Zahl in EAX zu laden. wie schon in meinem vorherigen Posting kurz angeschnitten, erwartet die CPU Befehle, die nach einem bestimmten Muster aufgebaut sind.Operand sagt was geschehen soll und danach folgt entweder eine Zahl die geladen/verrechnet werden soll oder die Adresse woher oder wohin geschrieben werden soll.
    Also: b8(10111000) ist die Anweisung die nächstfolgende Zahl in EAX Register zu laden.
    Jetzt warum da noch 00000001 steht und dahinter noch 3 Bytes mit nullen:
    Es könnte etwas verwirrend sein, aber das ist der Little-Endian prinzip:
    Die CPU die nach diesem Prinzip arbeitet, speichert ihre Variablen(also Speicheradressen, Zahlen usw) "verkehrt". Das heißt dass die Bytes von hinten nach vorne(oder von rechts nach links, wie mans sieht) geschrieben wernden - beispiel: die Zahl (in hex): 20d2 wird in den Speicher d2 20 geschrieben. http://de.wikipedia.org/wiki/Endian
    Deshalb stehen da auch

    00000001 00000000 00000000 00000000
    

    und nicht

    00000000 00000000 00000000 00000001
    

    Nicht alle CPUs machens so, z.B die von MAC (G) speichert nach Big Endian.
    Warum das so ist, kann ich nicht sagen... 😉
    Das heißt aber für uns speziell wenn wir die Werte aus dem Speicher von unserem Pentium/Amd nehmen, müssen wir die noch umstellen, bevor wir sie nach dezimal umrechnen können.
    Das selbe mit der zweiten Zeile:

    (00000)101 11100110 00000011 00000000 00000000
    

    die Zeile in Hex heißt:

    05 e6 03 00 00
    

    dabei ist die 05(00000101) die Anweisung ADD EAX,x
    und weiterhin folg die Zahl:

    11100110 00000011 00000000 00000000
    

    wenn man diese umrechnen will ohne sie vorher umzustellen dann
    gibt der taschenrechner natürlich 3858956288 aus.Deshalb umstellen:

    00000000 00000000 00000011 11100110
    

    jetzt umrechnen: 998

    PS: woher ich weißt welcher opcode was ist:
    ich hab "assembler ge-packt" von Joachim rohde (schon ca. seit 3-4 Jahren) und natürlich hab ich auch OllyDbg
    wo man einfach die Anweisungen reinschreibt und dieser die direkt übersetzt 🙂

    Zu den Processorbefehlen: nicht alle befehle sind nur 8-bit groß, es gibt relativ viele die mehr belegen.Aber das ist eine ganz andere Geschichte 😉


Anmelden zum Antworten