32-Bit-Computer können nur Ganzzahlen mit Vorzeichen bis zu 2 31 - 1 speichern . Aus
diesem Grund sind uns die IPv4-Adressen ausgegangen und die 64-Bit-Ära hat begonnen.
Die Zahl 2 31 - 1 (2.147.483.647) ist jedoch nicht so groß wie die Zahl 1 Billionen (1.000.000.000.000), die ich anscheinend ohne Absturz meiner Maschine gut darstellen kann.
Kann mir jemand erklären woran das liegt?
10^9
ohne dass mein PC abstürzt?" sondern "Wie kann ich schreiben,10^(18)
ohne dass mein Gehirn abstürzt?"Antworten:
Ich beantworte Ihre Frage mit einer anderen:
Sie zählen wahrscheinlich mit einer Hand bis zur größtmöglichen Zahl und wechseln dann zu Ihrer zweiten Hand, wenn Ihnen die Finger ausgehen. Computer tun dasselbe, wenn sie einen Wert darstellen müssen, der größer ist als ein einzelnes Register, verwenden sie mehrere 32-Bit-Blöcke, um mit den Daten zu arbeiten.
quelle
Sie haben Recht, dass eine 32-Bit-Ganzzahl keinen Wert größer als 2 ^ 32-1 enthalten kann. Der Wert dieser 32-Bit-Ganzzahl und die Darstellung auf Ihrem Bildschirm sind jedoch zwei völlig verschiedene Dinge. Die gedruckte Zeichenfolge "1000000000000" wird nicht durch eine 32-Bit-Ganzzahl im Speicher dargestellt.
Um die Zahl "1000000000000" buchstäblich anzuzeigen, sind 13 Byte Speicher erforderlich. Jedes einzelne Byte kann einen Wert von bis zu 255 enthalten. Keines von ihnen kann den gesamten numerischen Wert enthalten, wird jedoch einzeln als ASCII-Zeichen interpretiert (z. B. wird das Zeichen '
0
' durch den Dezimalwert 48, den Binärwert dargestellt00110000
) Lassen Sie sich zu einem Format zusammenfügen, das für Sie, einen Menschen, Sinn ergibt.Ein verwandtes Konzept in der Programmierung ist Typecasting . Auf diese Weise interpretiert ein Computer einen bestimmten Strom von
0
s und1
s. Wie im obigen Beispiel kann es als numerischer Wert, als Zeichen oder sogar als etwas ganz anderes interpretiert werden. Während eine 32-Bit-Ganzzahl möglicherweise nicht in der Lage ist, einen Wert von 1000000000000 zu speichern, kann eine 32-Bit-Gleitkommazahl dies unter Verwendung einer völlig anderen Interpretation tun.Es gibt 64-Bit-Ganzzahlen (die Werte von bis zu 16 Milliarden Milliarden aufnehmen können), Gleitkommawerte sowie spezialisierte Bibliotheken, die mit beliebig großen Werten arbeiten können zahlen.
quelle
1000000000000
genau darstellen. Es ist 10 ^ 12 oder 2 ^ 12 * 5 ^ 12; 5 ^ 12 benötigt 28 Bits Mantisse.In erster Linie können 32-Bit-Computer Zahlen bis zu 2³²-1 in einem einzigen Maschinenwort speichern . Maschinenwort ist die Datenmenge, die die CPU auf natürliche Weise verarbeiten kann (dh Vorgänge mit Daten dieser Größe werden in Hardware implementiert und sind im Allgemeinen am schnellsten durchzuführen). 32-Bit-CPUs verwenden Wörter, die aus 32 Bits bestehen, und können daher Zahlen von 0 bis 2³²-1 in einem Wort speichern .
Zweitens sind 1 Billion und 1000000000000 zwei verschiedene Dinge.
Durch 1einmaliges und dann 012- maliges Drücken geben Sie Text ein. 1Eingänge
1
, 0Eingänge0
. Sehen? Sie tippen Zeichen. Zeichen sind keine Zahlen. Schreibmaschinen hatten überhaupt keine CPU oder Speicher und sie handhabten solche "Zahlen" ziemlich gut, weil es nur Text ist.Beweisen Sie, dass 1000000000000 keine Zahl ist, sondern Text: Dies kann 1 Billion (in Dezimalzahl), 4096 (in Binärzahl) oder 281474976710656 (in Hexadezimalzahl) bedeuten. Es hat in verschiedenen Systemen noch mehr Bedeutungen. Die Bedeutung von 1000000000000 ist eine Zahl, und das Speichern ist eine andere Geschichte (wir werden gleich darauf zurückkommen).
Zum Speichern des Textes (in der Programmierung heißt er String ) 1000000000000 benötigen Sie 14 Bytes (eines für jedes Zeichen plus ein abschließendes NULL-Byte, was im Grunde bedeutet, dass der String hier endet). Das sind 4 Maschinenwörter. 3 und die Hälfte wären genug, aber wie gesagt, Operationen an Maschinenwörtern sind am schnellsten. Angenommen, ASCII wird für die Textspeicherung verwendet. Im Speicher sieht dies folgendermaßen aus: (Konvertieren von ASCII-Codes entsprechend
0
und1
in Binärform, jedes Wort in einer separaten Zeile)Vier Zeichen passen in ein Wort, der Rest wird zum nächsten verschoben. Der Rest wird zum nächsten Wort verschoben, bis alles (einschließlich des ersten NULL-Bytes) passt.
Nun zurück zum Speichern von Nummern. Das funktioniert genauso wie bei überfülltem Text, sie werden jedoch von rechts nach links angepasst. Es mag kompliziert klingen, hier ist ein Beispiel. Der Einfachheit halber nehmen wir an, dass:
0..9
Hier ist ein leerer 2-Wort-Speicher:
Speichern wir die Nummer 4:
Fügen wir nun 9 hinzu:
Beachten Sie, dass beide Operanden in ein Byte passen würden, aber nicht das Ergebnis. Aber wir haben noch einen gebrauchsfertigen. Speichern wir nun 99:
Auch hier haben wir das zweite Byte verwendet, um die Nummer zu speichern. Fügen wir 1 hinzu:
Whoops ... Das nennt man Integer Overflow und ist eine Ursache für viele schwerwiegende, manchmal sehr teure Probleme .
Wenn wir jedoch einen Überlauf erwarten, können wir dies tun:
Und jetzt addiere 1:
Es wird klarer, wenn Sie bytetrennende Leerzeichen und Zeilenumbrüche entfernen:
Wir haben vorausgesagt, dass ein Überlauf auftreten und wir möglicherweise zusätzlichen Speicher benötigen. Der Umgang mit Zahlen ist nicht so schnell wie bei Zahlen, die in einzelne Wörter passen, und muss in Software implementiert werden. Durch Hinzufügen der Unterstützung für Zwei-32-Bit-Wortnummern zu einer 32-Bit-CPU wird diese effektiv zu einer 64-Bit-CPU (jetzt kann sie von Haus aus mit 64-Bit-Nummern arbeiten, oder?).
Alles, was ich oben beschrieben habe, gilt auch für den Binärspeicher mit 8-Bit-Bytes und 4-Byte-Wörtern.
Das Konvertieren solcher Zahlen in ein Dezimalsystem ist jedoch schwierig. (aber es funktioniert ziemlich gut mit hexadezimal )
quelle
large as the number 1 trillion (1000000000000)
. Außerdem reden Sie fast über Arbitrary-Precision Arithmetic , aber Sie erwähnen nie wirklich einen der Begriffe für das, was Sie sagen ...Sie können auch "DIESE STATEMENT IST FALSCH" schreiben, ohne dass Ihr Computer abstürzt es wird interpretiert.
Bearbeiten: jetzt mit
weniger Sarkasmusmehr nützliche Informationen auf verschiedene Arten, wie eine Nummer im Speicher gespeichert werden kann. Ich werde diese mit höherer Abstraktion beschreiben, dh mit Begriffen, in die ein moderner Programmierer möglicherweise Code schreibt, bevor er sie zur Ausführung in Maschinencode übersetzt.Daten auf einem Computer müssen auf einen bestimmten Typ beschränkt sein , und eine Computerdefinition dieses Typs beschreibt, welche Vorgänge mit diesen Daten durchgeführt werden können und wie (dh Vergleichen von Zahlen, Verketten von Text oder XOR als Boolescher Wert). Sie können einer Zahl nicht einfach Text hinzufügen, genauso wie Sie eine Zahl nicht mit Text multiplizieren können, sodass einige dieser Werte zwischen Typen konvertiert werden können.
Beginnen wir mit vorzeichenlosen ganzen Zahlen . Bei diesen Wertetypen werden alle Bits zum Speichern von Informationen zu Ziffern verwendet. yours ist ein Beispiel für eine 32-Bit-Ganzzahl ohne Vorzeichen, in der ein beliebiger Wert von
0
to2^32-1
gespeichert werden kann. Und ja, je nach Sprache oder Architektur der verwendeten Plattform können 16-Bit-Ganzzahlen oder 256-Bit-Ganzzahlen verwendet werden.Was ist, wenn Sie negativ werden wollen? Intuitiv ist vorzeichenbehaftete Ganzzahlen der Name des Spiels. Übereinkommen ist es, alle Werte zuweisen aus
-2^(n-1)
zu2^(n-1)-1
- auf diese Weise vermeiden wir die Verwirrung, die mit zwei Arten umgehen zu schreiben+0
und-0
. Eine 32-Bit-Ganzzahl mit Vorzeichen würde also einen Wert von-2147483648
bis enthalten2147483647
. Ordentlich, nicht wahr?Ok, wir haben ganze Zahlen behandelt, bei denen es sich um Zahlen ohne Dezimalstelle handelt. Das auszudrücken ist kniffliger: Der nicht ganzzahlige Teil kann sinnvollerweise nur irgendwo zwischen
0
und liegen1
, daher würde jedes zusätzliche Bit, das zur Beschreibung verwendet wird, die Genauigkeit erhöhen: 1/2, 1/4, 1/8 ... Das Problem liegt bei Ihnen Ich kann eine einfache Dezimalstelle nicht genau0.1
als Summe von Brüchen ausdrücken, deren Nenner nur Zweierpotenzen haben kann! Wäre es nicht viel einfacher, die Zahl als Ganzzahl zu speichern, aber stimmen Sie zu, stattdessen den Dezimalpunkt zu setzen? Dies nennt man Festkommazahlen , in denen wir speichern, uns1234100
aber auf eine Konvention einigen, um sie1234.100
stattdessen so zu lesen .Ein relativ gebräuchlicherer Typ für Berechnungen ist
floating point
. Die Art und Weise, wie es funktioniert, ist wirklich ordentlich. Es wird ein Bit zum Speichern des Vorzeichenwerts verwendet, dann ein Bit zum Speichern von Exponenten und Signifikanten. Es gibt Standards, die solche Zuordnungen definieren, aber für ein 32-Bit-Float ist die maximale Anzahl, die Sie speichern können, überwältigendDies geht jedoch zu Lasten der Präzision. In Browsern verfügbares JavaScript verwendet 64-Bit-Floats und kann die Dinge immer noch nicht richtig machen. Kopieren Sie dies einfach in die Adressleiste und drücken Sie die Eingabetaste. Spoiler-Alarm: Das Ergebnis wird nicht sein
0.3
.Es gibt weitere alternative Typen wie Microsoft .NET 4.5
BigInteger
, die theoretisch keine oberen oder unteren Grenzen haben und in "Batches" berechnet werden müssen. Aber vielleicht sind die faszinierenderen Technologien diejenigen, die Mathematik verstehen , wie die Wolfram Mathematica-Engine, die genau mit abstrakten Werten wie Unendlich arbeiten kann .quelle
Der Schlüssel ist zu verstehen, wie Computer Zahlen codieren .
Wenn ein Computer darauf besteht, Zahlen mit einer einfachen binären Darstellung der Zahl mit einem einzelnen Wort (4 Byte in einem 32-Bit-System) zu speichern, kann ein 32-Bit-Computer nur Zahlen bis zu 2 ^ 32 speichern. Aber es gibt viele andere Möglichkeiten, Zahlen zu kodieren, je nachdem, was Sie damit erreichen möchten.
Ein Beispiel ist, wie Computer Gleitkommazahlen speichern. Computer können eine ganze Reihe verschiedener Methoden verwenden, um sie zu codieren. Der Standard IEEE 754 definiert Regeln für die Codierung von Zahlen, die größer als 2 ^ 32 sind. Grob gesagt können Computer dies implementieren, indem sie die 32 Bits in verschiedene Teile aufteilen, die einige Ziffern der Zahl darstellen, und andere Bits, die die Größe der Zahl darstellen (dh den Exponenten, 10 ^ x). Dies ermöglicht eine viel größere Reichweitevon Zahlen in Bezug auf die Größe, aber beeinträchtigt die Präzision (die für viele Zwecke in Ordnung ist). Natürlich kann der Computer für diese Codierung auch mehr als ein Wort verwenden, wodurch die Genauigkeit der Größe der verfügbaren codierten Zahlen erhöht wird. Die einfache 32-Dezimal-Version des IEEE-Standards ermöglicht Zahlen mit einer Genauigkeit von etwa 7 Dezimalstellen und Zahlen mit einer Größe von bis zu etwa 10 ^ 96.
Es gibt jedoch noch viele andere Optionen, wenn Sie zusätzliche Präzision benötigen. Offensichtlich können Sie mehr Wörter in Ihrer Kodierung ohne Einschränkung verwenden (allerdings mit einem Leistungsnachteil beim Konvertieren in und aus dem kodierten Format). Wenn Sie eine Möglichkeit erkunden möchten, wie dies getan werden kann, gibt es ein großartiges Open-Source-Add-In für Excel, das ein Kodierungsschema verwendet, das die Berechnung mit einer Genauigkeit von Hunderten von Ziffern ermöglicht. Das Add-In heißt Xnumbers und ist hier verfügbar . Der Code ist in Visual Basic, was nicht der schnellste ist, aber den Vorteil hat, dass er leicht zu verstehen und zu ändern ist. Auf diese Weise erfahren Sie, wie Computer längere Zahlen codieren. Und Sie können mit den Ergebnissen in Excel herumspielen, ohne Programmiertools installieren zu müssen.
quelle
Es ist alles in deiner Frage.
Sie können eine beliebige Zahl auf Papier schreiben . Versuchen Sie, eine Billion Punkte auf ein weißes Blatt Papier zu schreiben. Es ist langsam und unwirksam. Deshalb haben wir ein 10-stelliges System, um diese großen Zahlen darzustellen. Wir haben sogar Namen für große Zahlen wie "Million", "Billion" und mehr, also sagst du es nicht
one one one one one one one one one one one...
laut.32-Bit-Prozessoren sind so konzipiert, dass sie mit genau 32 Binärziffern langen Speicherblöcken am schnellsten und effizientesten arbeiten. Aber wir, die Menschen, benutzen gewöhnlich ein 10-stelliges numerisches System und Computer, die elektronisch sind, benutzen ein 2-stelliges System ( binär ). Die Zahlen 32 und 64 sind zufällig Potenzen von 2. Eine Million und eine Billion sind also Potenzen von 10. Es ist für uns einfacher, mit diesen Zahlen zu arbeiten, als zum Beispiel mit einer Vielzahl von 65536.
Wir zerlegen große Zahlen in Ziffern, wenn wir sie auf Papier schreiben. Computer teilen Zahlen in eine größere Anzahl von Ziffern auf. Wir können jede beliebige Zahl aufschreiben, und die Computer auch, wenn wir sie so gestalten.
quelle
32bit und 64bit beziehen sich auf Speicheradressen. Ihr Computerspeicher ist wie ein Postfach, jedes hat eine andere Adresse. Die CPU (Central Processing Unit) verwendet diese Adressen, um Speicherstellen in Ihrem RAM (Random Access Memory) zu adressieren. Wenn die CPU nur 16-Bit-Adressen verarbeiten konnte, konnten Sie nur 32 MB RAM verwenden (was zu diesem Zeitpunkt riesig schien). Mit 32bit ging es auf 4 + GB (was zu der Zeit riesig schien). Jetzt, da wir 64-Bit-Adressen haben, geht der RAM in Terabyte über (was riesig erscheint).
Das Programm ist jedoch in der Lage, mehrere Speicherblöcke für die Speicherung von Zahlen und Text zuzuweisen, die dem Programm überlassen sind und sich nicht auf die Größe der einzelnen Adressen beziehen. Damit ein Programm der CPU mitteilen kann, werde ich 10 Adressblöcke verwenden und dann eine sehr große Zahl oder einen 10-Buchstaben-String oder was auch immer speichern.
Randnotiz: Auf Speicheradressen wird durch "Zeiger" verwiesen, sodass der 32- und 64-Bit-Wert die Größe des Zeigers angibt, der für den Zugriff auf den Speicher verwendet wird.
quelle
Da die Anzeige der Nummer aus einzelnen Zeichen und nicht aus ganzen Zahlen besteht. Jede Ziffer in der Zahl wird mit einem separaten Zeichenliteral dargestellt, dessen ganzzahliger Wert durch die verwendete Codierung definiert wird, beispielsweise
'a'
mit ASCII-Wert dargestellt wird97
, während'1'
mit dargestellt wird49
. Überprüfen Sie die ASCII-Tabelle hier .Für die Anzeige ist sowohl 'a' als auch '1' gleich. Sie sind Zeichenliterale, keine ganzen Zahlen. Jedes Zeichenliteral darf auf einer 32-Bit-Plattform einen Maximalwert von 255 haben und den Wert in 8-Bit- oder 1-Byte-Größe speichern angezeigt. Wie viele separate Zeichen sie anzeigen können, hängt vom Arbeitsspeicher ab. Wenn Sie nur 1 Byte RAM haben, können Sie nur ein Zeichen anzeigen. Wenn Sie 1 GB RAM haben, können Sie gut 1024 * 1024 * 1024 Zeichen anzeigen.
Diese Einschränkung gilt jedoch für die Berechnungen, aber ich denke, Sie interessieren sich für den IPV4-Standard. Obwohl es nicht ganz mit Computern zu tun hat
bit-size
, es hat irgendwie die Standards beeinflusst. Beim Erstellen des IPV4-Standards wurden die IP-Werte in 32-Bit-Ganzzahlen gespeichert. Jetzt hast du einmal die Größe angegeben, und es wurde Standard. Alles, was wir über das Internet wissen, war davon abhängig, und dann gingen uns die IP-Adressen aus, um sie zuzuweisen. Wenn also der IP-Standard auf 64-Bit überarbeitet wurde, funktioniert einfach alles nicht mehr, einschließlich Ihres Routers (ich nehme an, dass dies korrekt ist) und anderer Netzwerkgeräte. Es muss also ein neuer Standard erstellt werden, der nur die 32-Bit-Ganzzahl durch eine 128-Bit-Ganzzahl ersetzt. Und der Rest des Standards angepasst. Hardware-Hersteller müssen nur erklären, dass sie diesen neuen Standard unterstützen, und er wird viral. Es ist zwar nicht so einfach, aber ich denke, Sie haben es verstanden.Haftungsausschluss: Die meisten der hier genannten Punkte stimmen mit meiner Annahme überein. Vielleicht habe ich hier wichtige Punkte verpasst, um es einfacher zu machen. Ich kann nicht gut mit Zahlen umgehen, also muss ich ein paar Ziffern übersehen haben, aber hier geht es darum, auf die Antwort des OP zu antworten, warum es den PC nicht zum Absturz bringt.
quelle
1
ist 0x31 in ASCII, nicht 0x1. 1 GB = 1024 ^ 3 B. IPv4 wurde erfunden, bevor 32-Bit-CPUs eingeführt wurden. Die Aussage, dass Adressen in 32-Bit-Ganzzahlen gespeichert wurden, widerspricht der Frage von OP. Und schließlich verwendet IPv6 128-Bit-Adressen und keine 64-Bit-Adressen.In Prozessoren gibt es "Wörter". Es gibt verschiedene Wörter. Wenn Leute "32-Bit-Prozessor" sagen, meinen sie meistens "Speicherbusbreite". Dieses Wort besteht aus verschiedenen "Feldern", die sich auf Untersysteme eines Computers beziehen, die dem Senden (24 Bits) und Steuern (andere Bits) entsprechen. Bei genauen Zahlen kann ich mich irren, überzeugen Sie sich anhand von Handbüchern.
Ganz anderer Aspekt ist die Berechnung. SSE- und MMX-Befehlssätze können lange Ganzzahlen speichern. Die maximale Länge ohne Produktivitätsverlust hängt von der aktuellen SSE-Version ab, liegt aber immer bei einem Vielfachen von 64 Bit.
Aktuelle Opteron-Prozessoren können 256-Bit-breite Zahlen verarbeiten (ich bin mir nicht sicher, aber float ist sicher).
Zusammenfassung : (1) Die Busbreite ist nicht direkt mit der Berechnungsbreite verbunden, (2) Auch verschiedene Wörter (Speicherwort, Registerwort, Buswort usw.) sind nicht miteinander verbunden, andere haben einen gemeinsamen Teiler von etwa 8 oder 16 oder 24. Viele Prozessoren verwendeten sogar 6-Bit-Wörter (aber deren Verlauf).
quelle
Der Zweck eines Computergeräts besteht im Allgemeinen darin, Daten zu akzeptieren, zu verarbeiten, zu speichern und zu senden. Die zugrunde liegende Hardware ist lediglich eine Maschine, mit deren Hilfe diese vier Funktionen ausgeführt werden können. Ohne Software geht das nicht.
Software ist der Code, der dem Gerät mitteilt, wie Daten akzeptiert, verarbeitet, gespeichert und an andere weitergegeben werden.
Die zugrunde liegende Hardware unterliegt immer Einschränkungen. Bei einer 32-Bit-Maschine sind die meisten Register, die Daten verarbeiten, nur 32 Bit breit. Dies bedeutet jedoch nicht, dass das Gerät keine Zahlen über 2 ^ 32 verarbeiten kann. Wenn Sie mit größeren Zahlen arbeiten möchten, benötigt das Gerät möglicherweise mehr als einen Zyklus, um sie zu akzeptieren, zu verarbeiten und zu speichern es, oder es ausstrahlen.
Die Software teilt dem Gerät mit, wie mit Zahlen umzugehen ist. Wenn die Software für den Umgang mit großen Zahlen ausgelegt ist, sendet sie eine Reihe von Anweisungen an die CPU, die angeben, wie mit den größeren Zahlen umgegangen werden soll. Beispielsweise kann Ihre Nummer durch zwei 32-Bit-Register dargestellt werden. Wenn Sie Ihrer Zahl 1.234 hinzufügen möchten, weist die Software die CPU an, zuerst 1.234 in das untere Register einzufügen und dann das Überlaufbit zu überprüfen, um festzustellen, ob diese Addition zu einer Zahl führt, die für das untere Register zu groß ist. Wenn dies der Fall ist, wird dem oberen Register eine 1 hinzugefügt.
Auf die gleiche Weise, wie Grundschüler lernen, mit Carry etwas hinzuzufügen, kann die CPU angewiesen werden, mit Zahlen umzugehen, die größer sind, als sie in einem einzigen Register enthalten können. Dies gilt für die meisten allgemeinen mathematischen Operationen für Zahlen jeder praktischen Größe.
quelle
Der Unterschied liegt darin, wie wir Daten in Computern speichern.
Sie haben Recht, dass wir für eine theoretische 8-Bit-Maschine nur 2 ^ 8-Werte in einem einzelnen Prozessorregister oder einer einzelnen Speicheradresse speichern können. (Bitte beachten Sie, dass dies von "Maschine" zu "Maschine" variiert, basierend auf dem verwendeten Prozessor, der Speicherarchitektur usw.)
Für eine theoretische 16-Bit-Maschine wäre der Maximalwert in einem Register / Speicherplatz 2 ^ 16, für eine 32-Bit-Maschine 2 ^ 32 usw.
Im Laufe der Jahre haben Programmierer alle Arten von Schikanen entwickelt, um Nummern zu speichern und zu verarbeiten, die größer sind als die, die in einem einzelnen Prozessorregister oder einer einzelnen Speicheradresse gespeichert werden können. Es gibt viele Methoden, aber alle umfassen die Verwendung von mehr als einer Register- / Speicheradresse, um Werte zu speichern, die größer als ihre "native" Register- / Speicherstellenbreite sind.
Alle diese Methoden haben den Vorteil, dass die Maschine Werte speichern / verarbeiten kann, die größer als ihre native Kapazität sind. Der Nachteil ist, dass fast alle Ansätze mehrere Maschinenbefehle / reads / etc erfordern. um mit diesen Zahlen umzugehen. Für die gelegentlich große Anzahl ist dies kein Problem. Bei vielen großen Nummern (insbesondere bei großen Speicheradressen) verlangsamt sich der Aufwand.
Daher der allgemeine Wunsch, Register, Speicherstellen und Speicheradressenhardware "breiter" und breiter zu machen, um große Zahlen "nativ" zu behandeln, so dass solche Zahlen mit der minimalen Anzahl von Operationen behandelt werden können.
Da die Anzahl unendlich groß ist, ist das Verhältnis von Prozessorregister / Speichergröße / Adressierung immer ein Gleichgewicht zwischen der nativen Anzahl und den Kosten, die mit der Implementierung immer größerer Breiten verbunden sind.
quelle
32-Bit-Computer können nur Zahlen bis zu 2 ^ 32 in einem einzigen Maschinenwort speichern. Dies bedeutet jedoch nicht, dass sie keine größeren Datenmengen verarbeiten können.
Die Bedeutung eines 32-Bit-Computers besteht im Allgemeinen darin, dass der Datenbus und der Adressbus 32 Bit breit sind, was bedeutet, dass der Computer 4 GB Speicheradressraum gleichzeitig verarbeiten und jeweils vier Datenbytes über den Datenbus senden kann .
Dies schränkt den Computer jedoch nicht darin ein, mehr Daten zu verarbeiten, sondern muss die Daten lediglich beim Senden über den Datenbus in Vier-Byte-Blöcke aufteilen.
Der normale Intel 32-Bit-Prozessor kann intern 128-Bit-Nummern verarbeiten, sodass Sie problemlos Nummern wie 1000000000000000000000000000000000000000000 verarbeiten können.
Sie können mit viel größeren Zahlen umgehen als mit einem Computer, aber dann müssen die Berechnungen per Software durchgeführt werden. Die CPU verfügt nicht über Anweisungen für den Umgang mit Zahlen, die größer als 128 Bit sind. (Es kann viel größere Zahlen in Form von Gleitkommazahlen verarbeiten, aber dann haben Sie nur eine Genauigkeit von 15 Stellen.)
quelle
Fügen Sie einfach eine Anmerkung zu den vielen anderen Antworten hinzu, da dies eine ziemlich wichtige Tatsache in dieser Frage ist, die übersehen wurde.
"32 Bit" bezieht sich auf die Speicheradressenbreite. Es hat nichts mit der Registergröße zu tun. Viele 32-Bit-CPUs haben wahrscheinlich 64 oder sogar 128-Bit-Register. Insbesondere in Bezug auf die x86-Produktlinie verfügen die neuesten Consumer-CPUs, die alle 64-Bit-CPUs sind, für spezielle Zwecke über bis zu 256-Bit-Register.
Dieser Unterschied zwischen der Registerbreite und der Adressbreite besteht seit jeher, als wir 4-Bit-Register und 8-Bit-Adressen hatten, oder umgekehrt.
Es ist leicht zu erkennen, dass das Speichern einer großen Zahl unabhängig von der Registergröße kein Problem darstellt, wie in anderen Antworten erläutert.
Der Grund , warum die Register, von was auch immer Größe sie sein passieren zu können, kann zusätzlich auch berechnen mit einer größeren Anzahl, ist , dass zu große Berechnungen aufgeteilt in mehrere kleinere werden können , die in die Register passen (es ist nur ein kleines bisschen komplizierter in Wirklichkeit).
quelle
Die bereits gegebenen Antworten sind eigentlich ziemlich gut, aber sie sprechen das Problem tendenziell von verschiedenen Seiten an und liefern daher ein unvollständiges Bild. Sie sind meiner Meinung nach auch ein bisschen zu technisch.
Um etwas zu verdeutlichen, das angedeutet ist, aber in keiner der anderen Antworten explizit zum Ausdruck kommt und von dem ich denke, dass es der springende Punkt ist:
Sie mischen mehrere Konzepte in Ihrer Frage , und eines von ihnen ("32-Bit") kann sich tatsächlich auf verschiedene Dinge beziehen (und unterschiedliche Antworten haben unterschiedliche Interpretationen angenommen). Diese Konzepte haben alle etwas mit der Anzahl der verwendeten (oder verfügbaren) Bits (1 und 0) in verschiedenen Rechenkontexten zu tun (was ich damit meine, wird hoffentlich durch die folgenden Beispiele verdeutlicht), aber die Konzepte sind ansonsten nicht miteinander verbunden .
Ausdrücklich:
Beachten Sie, dass dies keine umfassende Liste von Interpretationen für die Phrase "32 Bit" sein soll.
Zusätzliches Verdienst: Um wirklich die bloße philosophische Unterscheidung zwischen Zahlen und primitiven Teilen des Computerspeichers zu sehen, lesen Sie etwas über Turing-Maschinen .
quelle
Wenn Sie beispielsweise 1000000000000 in den Taschenrechner schreiben, berechnet der Computer die Zahl als reelle Zahl mit Dezimalpunkt . Das von Ihnen erwähnte Limit für 32 Bit berührt mehr alle Zahlen vom Typ Integer ohne Dezimalpunkt. Unterschiedliche Datentypen verwenden unterschiedliche Methoden, um in Bits / Bytes zu gelangen.
Ganzzahlige Zahlen : Diese Tabelle kann Ihnen dabei helfen, den Punkt herauszufinden ( http://msdn.microsoft.com/en-us/library/296az74e.aspx ). Dies berührt Grenzen für C ++. Die Int64-Typennummer hat beispielsweise Grenzwerte von -9223372036854775808 bis 9223372036854775807.
Reelle Typenzahlen : Reelle Typenzahlen enthalten Werte mit Gleitkomma und Exponenten. Sie können auch viel größere Zahlen eingeben, jedoch mit eingeschränkter Genauigkeit. ( http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) Zum Beispiel hat LDBL (Large Double) in C ++ den maximalen Exponenten 308, sodass Sie möglicherweise eine Zahl eingeben oder als Ergebnis haben
9.999 x 10^308
können theoretisch 308 (+1) Ziffern haben,9
aber nur 15 der wichtigsten Ziffern werden zur Darstellung verwendet, Rest geht verloren, da die Genauigkeit begrenzt ist.Darüber hinaus gibt es verschiedene Programmiersprachen, und sie können unterschiedliche Implementierungen von Zahlenbeschränkungen aufweisen. Sie können sich also vorstellen, dass spezialisierte Anwendungen viel größere (und / oder genauere / genauere) Zahlen verarbeiten können als C ++.
quelle
Für den Fall, dass Sie ein praktisches Beispiel möchten, wie viele Programme auf einem typischen Linux-System eine große Anzahl von Verarbeitungs- und Ausgabevorgängen ausführen:
libgmp
- Die GNU Multiple Precision Arithmetic Library ist die auf Linux-Systemen am häufigsten verwendete Bibliothek für diesen Zweck. Ein einfaches Beispiel für das Multiplizieren von 2 ^ 80 mit 1000:Im Grunde ist es dasselbe wie bei der Verwendung der normalen Operatoren + - * /, nur mit einer Bibliothek, um die Zahlen aufzuteilen und intern als Zahlen mit mehreren Maschinenwörtern (dh 32-Bit) zu speichern. Es gibt auch Funktionen vom Typ scanf (), mit denen Sie Texteingaben in Ganzzahltypen konvertieren können.
Die Struktur von
mpz_t
ist genau wie das Beispiel von Scott Chamberlain, bei dem mit zwei Händen bis 6 gezählt wird. Es handelt sich im Grunde genommen um eine Reihe vonmp_limb_t
Typen mit Maschinenwortgröße. Wenn eine Zahl zu groß ist, um in ein Maschinenwort zu passen, verwendet GMP mehreremp_limb_t
, um die hohen / niedrigen Teile der Zahl zu speichern.quelle
In deinem Kopf kennst du nur 10 verschiedene Ziffern. 0 bis 9. Intern in Ihrem Gehirn ist dies sicherlich anders als in einem Computer codiert.
Ein Computer verwendet Bits zum Codieren von Zahlen, aber das ist nicht wichtig. Genau so haben sich Ingenieure entschieden, Dinge zu kodieren, aber das sollten Sie ignorieren. Sie können es sich wie einen 32-Bit-Computer vorstellen, der eine eindeutige Darstellung von mehr als 4 Milliarden verschiedenen Werten aufweist, während wir Menschen eine eindeutige Darstellung für 10 verschiedene Werte haben.
Wann immer wir eine größere Zahl erfassen müssen, verwenden wir ein System. Die am weitesten links stehende Zahl ist die wichtigste. Es ist zehnmal wichtiger als das nächste Mal.
Ein Computer, der in der Lage ist, zwischen vier Milliarden verschiedenen Werten zu unterscheiden, muss in ähnlicher Weise den Wert ganz links in einer Reihe von Werten vier Milliarden Mal so wichtig machen wie den nächsten Wert in dieser Reihe. Eigentlich kümmert sich ein Computer gar nicht darum. Sie weist Zahlen keine "Wichtigkeit" zu. Programmierer müssen dafür speziellen Code erstellen.
Immer wenn ein Wert größer wird als die Anzahl der eindeutigen Symbole, 9 in einem menschlichen Verstand, fügen Sie der Zahl auf der linken Seite eine hinzu.
In diesem Fall passt die Nummer immer noch in einen einzelnen "Steckplatz".
Der Mensch hat also immer das Problem, nicht genügend eindeutige Symbole zu haben. Wenn der Computer nicht über ein System verfügt, das sich damit befasst, würde er einfach 0 schreiben und dabei vergessen, dass es eine zusätzliche Zahl gibt. Glücklicherweise haben Computer ein "Überlauf-Flag", das in diesem Fall ausgelöst wird.
Möglicherweise haben Sie in der Schule eine Methode gelernt. Ein Algorithmus. Der Algorithmus ist recht einfach. Fügen Sie zunächst die beiden Symbole ganz links hinzu.
Dann bewegen Sie sich zum nächsten Steckplatz und führen die gleiche Addition durch.
Da wir einen Überlauf hatten, bedeutet dies, dass wir zur nächsten Zahl 1 addieren müssen.
Es müssen keine Zahlen mehr hinzugefügt werden, daher erstellen wir einfach einen Slot und fügen 1 ein, da das Überlauf-Flag angehoben wurde.
Ein Computer macht es genauso, außer dass er 2 ^ 32 oder besser 2 ^ 64 verschiedene Symbole hat, anstatt nur 10 wie Menschen.
Auf Hardwareebene bearbeitet der Computer einzelne Bits auf genau dieselbe Weise. Zum Glück ist das für Programmierer weggebannt. Bits besteht nur aus zwei Ziffern, da dies in einer Stromleitung leicht darstellbar ist. Entweder ist das Licht an oder es ist aus.
Schließlich könnte ein Computer eine beliebige Zahl als einfache Folge von Zeichen anzeigen. Das können Computer am besten. Der Algorithmus zum Konvertieren zwischen einer Folge von Zeichen und einer internen Darstellung ist ziemlich komplex.
quelle
Weil Sie nicht eine Zahl anzeigen (was den Computer betrifft), sondern eine Zeichenfolge oder eine Ziffernfolge. Klar, einige Apps (wie der Taschenrechner, denke ich), die sich mit Zahlen befassen, können mit einer solchen Zahl umgehen, denke ich. Ich weiß nicht, welche Tricks sie verwenden ... Ich bin sicher, dass einige der anderen, ausführlicheren Antworten dies abdecken.
quelle
Der größte Teil des Inhalts dieser Antwort stammte ursprünglich aus dieser Antwort (geschrieben, bevor diese andere Frage als Duplikat markiert wurde). Ich diskutiere also die Verwendung von 8-Bit-Werten (obwohl diese Frage zu 32-Bit-Werten gestellt wurde), aber das ist in Ordnung, da 8-Bit-Werte konzeptionell einfacher zu verstehen sind und die gleichen Konzepte für größere Werte wie 32-Bit-Arithmetik gelten.
Wenn Sie zwei 8-Bit-Zahlen hinzufügen, erhalten Sie die größte Zahl (0xFF + 0xFF = 1FE). Wenn Sie zwei 8-Bit-Zahlen multiplizieren, beträgt die größte Zahl, die Sie erhalten können (0xFF * 0xFF = 0xFE01), immer noch 16 Bit, zweimal 8 Bit.
Nun können Sie davon ausgehen, dass ein x-Bit-Prozessor nur x-Bits verfolgen kann. (Zum Beispiel kann ein 8-Bit-Prozessor nur 8 Bit verfolgen.) Das ist nicht korrekt. Der 8-Bit-Prozessor empfängt Daten in 8-Bit-Blöcken. (Diese "Chunks" haben normalerweise einen formalen Begriff: ein "Wort". Auf einem 8-Bit-Prozessor werden 8-Bit-Wörter verwendet. Auf einem 64-Bit-Prozessor können 64-Bit-Wörter verwendet werden.)
Wenn Sie dem Computer also 3 Bytes geben:
Byte 1: Der MUL-Befehl
Byte 2: Die Bytes höherer Ordnung (z. B. 0xA5)
Byte 3: Die Bytes niedrigerer Ordnung (z. B. 0xCB)
Der Computer kann ein Ergebnis erzeugen, das ist mehr als 8 Bits. Die CPU kann folgende Ergebnisse erzeugen:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Lassen Sie mich das jetzt interpretieren:
0x bedeutet nur, dass die folgenden Ziffern hexadezimal sind.
Ich werde die "40" kurz genauer besprechen.
82 ist Teil des "A" -Registers, das eine Reihe von 8 Bits ist.
xx und xx sind Teil von zwei anderen Registern, die als "B" -Register und "C" -Register bezeichnet werden. Der Grund, warum ich diese Bits nicht mit Nullen oder Einsen gefüllt habe, ist, dass ein "ADD" -Befehl (der an die CPU gesendet wird) dazu führen kann, dass diese Bits durch den Befehl unverändert bleiben (wohingegen die meisten anderen Bits, die ich in diesem Beispiel verwende, dies können geändert werden (mit Ausnahme einiger Flag-Bits).
D7 würde in mehr Bits passen, die als "D" -Register bezeichnet werden.
Ein Register ist nur ein Stück Erinnerung. In den CPUs sind Register eingebaut, so dass die CPU auf Register zugreifen kann, ohne mit dem Speicher auf einem RAM-Stick interagieren zu müssen.
Das mathematische Ergebnis von 0xA5 mal 0xCB ist also 0x82D7.
Warum wurden die Bits in die A- und D-Register anstelle der A- und B-Register oder der C- und D-Register aufgeteilt? Nun, noch einmal, dies ist ein Beispielszenario, das ich verwende und dessen Konzept einer echten Assemblersprache (Intel x86 16-Bit, wie es von Intel 8080 und 8088 und vielen neueren CPUs verwendet wird) ähnelt. Möglicherweise gibt es einige allgemeine Regeln, z. B. das "C" -Register, das normalerweise als Index für Zählvorgänge verwendet wird (typisch für Schleifen), und das "B" -Register, das zum Verfolgen von Offsets verwendet wird, mit denen Speicherorte angegeben werden können. So können "A" und "D" für einige der üblichen arithmetischen Funktionen üblicher sein.
Jeder CPU-Befehl sollte eine Dokumentation enthalten, die von Personen verwendet wird, die in Assembly programmieren. In dieser Dokumentation sollte angegeben werden, welche Register von den einzelnen Befehlen verwendet werden. (Die Auswahl der zu verwendenden Register wird daher häufig von den Entwicklern der CPU festgelegt, nicht von den Assembler-Programmierern. Es kann jedoch Flexibilität geben.)
Kommen wir nun zu "40" im obigen Beispiel zurück: Das ist eine Reihe von Bits, die oft als "Flags-Register" bezeichnet werden. Jedes Bit im Flags-Register hat einen Namen. Zum Beispiel gibt es ein "Überlauf" -Bit, das die CPU möglicherweise setzt, wenn das Ergebnis größer ist als der Speicherplatz, der ein Byte der Ergebnisse speichern kann. (Das "Überlauf" -Bit wird häufig mit dem abgekürzten Namen "OF" bezeichnet. Dies ist ein Großbuchstabe o, keine Null.) Die Software kann den Wert dieses Flags überprüfen und das "Problem" feststellen. Die Arbeit mit diesem Bit wird von höheren Sprachen häufig unsichtbar ausgeführt, sodass Programmieranfänger häufig nicht lernen, wie sie mit den CPU-Flags interagieren. Assembly-Programmierer greifen jedoch häufig auf einige dieser Flags zu, ähnlich wie bei anderen Variablen.
Zum Beispiel könnten Sie mehrere ADD-Anweisungen haben. Ein ADD-Befehl speichert möglicherweise 16 Bit der Ergebnisse im A-Register und im D-Register, während ein anderer Befehl möglicherweise nur die 8 niedrigen Bits im A-Register speichert, das D-Register ignoriert und das Überlaufbit angibt. Dann, später (nach dem Speichern der Ergebnisse des A-Registers in den Haupt-RAM), könnten Sie einen anderen ADD-Befehl verwenden, der nur die 8 hohen Bits in einem Register (möglicherweise dem A-Register) speichert hängt davon ab, welche Multiplikationsanweisung Sie verwenden.
(Es gibt auch häufig ein "Unterlauf" -Flag, falls Sie zu viel subtrahieren, um das gewünschte Ergebnis zu erzielen.)
Nur um Ihnen zu zeigen, wie kompliziert es wurde:
Der Intel 4004 war eine 4-Bit-CPU
Der Intel 8008 war eine 8-Bit-CPU. Es hatte 8-Bit-Register mit den Namen A, B, C und D.
Der Intel 8086 war eine 16-Bit-CPU. Es hatte 16-Bit-Register mit den Namen AX, BX, CX und DX.
Der Intel 80386 war eine 32-Bit-CPU. Es hatte 32-Bit-Register mit den Namen EAX, EBX, ECX und EDX.
Die Intel x64-CPUs haben 64-Bit-Register mit den Namen RAX, RBX, RCX und RDX. Die x64-Chips können (in einigen Betriebsmodi) 16-Bit-Code ausführen und 16-Bit-Anweisungen interpretieren. Dabei sind die Bits, aus denen das AX-Register besteht, die Hälfte der Bits, aus denen das EAX-Register besteht, also die Hälfte der Bits, aus denen das RAX-Register besteht. Wenn Sie also den Wert von AX ändern, ändern Sie auch EAX und RAX, da die von AX verwendeten Bits Teil der von RAX verwendeten Bits sind. (Wenn Sie den EAX um ein Vielfaches von 65.536 ändern, bleiben die niedrigen 16 Bits unverändert, sodass sich AX nicht ändert. Wenn Sie den EAX um einen Wert ändern, der kein Vielfaches von 65.536 ist, wirkt sich dies auch auf AX aus .)
Es gibt mehr Flaggen und Register als nur die, die ich erwähnt habe. Ich habe einfach einige häufig verwendete ausgewählt, um ein einfaches konzeptionelles Beispiel zu liefern.
Wenn Sie auf einer 8-Bit-CPU arbeiten und in den Speicher schreiben, können Sie möglicherweise Einschränkungen feststellen, wenn Sie auf eine Adresse mit 8 Bits verweisen möchten, nicht auf eine Adresse mit 4 Bits oder 16 Bits. Die Details variieren je nach CPU. Wenn Sie jedoch solche Einschränkungen haben, kann es sein, dass die CPU mit 8-Bit-Wörtern arbeitet. Aus diesem Grund wird die CPU am häufigsten als "8-Bit-CPU" bezeichnet.
quelle