PC und große Zahlen darstellen?
-
Guten Tag!
-
Wie macht es mein PC dass er diese Zahl darstellen kann
99999999999999999999999999999999 ? (32 Stellen) -
Wie sieht 99999999999999999999999999999999 (32 Stellen) als Binärzahl aus?
-
Welche Zahl kann meine Zahl maximal darstellen und danach nicht mehr?
-
Wenn 8 bits 1 Byte sind und um eine Ziffer darzustellen 8bits notwendig
sind brauchen wir für 99999999999999999999999999999999 32 * 8 = 256 bits.
Ist das richtig??????? -
Ich verwechsele folgendes: Werden Zahlen nur mittels Asci-Zeichensatz
dargestellt
z.B wenn ich die Zahl neun darstellen möchte ist es der AsciCode
057(Dezimal) 00111001(Binär) bedeutet für das obige Bsp 999....
00111001 00111001 00111001 00111001 00111001 00111001 00111001 00111001
00111001 00111001 00111001 00111001 00111001 00111001 00111001 00111001
00111001 00111001 00111001 00111001 00111001 00111001 00111001 00111001
00111001 00111001 00111001 00111001 00111001 00111001 00111001 00111001
Grüße
-
-
Also nun mal langsam !
Ist diese Zahl ein String oder wirklich ne Zahl?Wenn es wirklich ne Zahl ist, dass ist es im Rechner als Kombination zweier Rechenregister möglich, 64-Bit-Zahlen zu nutzen. Das sind dann 2^64 Zahlen.
(quasi wären 16Exabyte mit einer 64 bit - Leitung adressierbar).
Dementsprechend bräuchtest zu zum binären Darstellen der Zahl nur 8 Byte.
Anderenfalls hast du recht, was die 256 Bit angeht.
-
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:
00000101Ich 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
10111100110000000110000000000000000die erste zeile ist: lade eine 1 in den EAX register
die zweite: addiere eine 998 dazuda man sich als mensch das nicht merken kann, lasse ich es mir lieber in HEX darstellen:
b8 01000000000
05 e6030000000wohlgemerkt 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ählenoder 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ärenaber 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
00001001Jetzt 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
00111001Jetzt 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 HandNatü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 register10111100110000000110000000000000000
Wo ist hier die Zahl 998 ????
10111100110000000110000000000000000 ist als
Dezimalzahl 25333792768Grüße
-
dieses Beispiel da oben hab ich mal schnell getippt und übersetzt
dabei darf man die zahl natürlich nicht komplett nehmen:
1011100000000001000000000000000000000000um 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 auch00000001 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 übersetztZu den Processorbefehlen: nicht alle befehle sind nur 8-bit groß, es gibt relativ viele die mehr belegen.Aber das ist eine ganz andere Geschichte