2014-01-07 20:18:51 +0000 2014-01-07 20:18:51 +0000
369
369
Advertisement

Wenn 32-Bit-Rechner nur Zahlen bis 2^32 verarbeiten können, warum kann ich dann 10000000000000000 (Billionen) schreiben, ohne dass mein Rechner abstürzt?

Advertisement

32-Bit-Rechner können nur signierte ganze Zahlen bis 231 - 1 speichern. Aus diesem Grund sind uns die IPv4-Adressen ausgegangen und wir sind in das 64-Bit-Zeitalter eingetreten.

Allerdings ist die Zahl 231 - 1 (2.147.483.647) nicht so groß wie die Zahl 1 Billion (1.000.000.000.000.000), die ich anscheinend gut darstellen kann, ohne dass mein Rechner abstürzt.

Kann jemand erklären, warum das so ist?

Advertisement

Antworten (18)

784
784
784
2014-01-07 20:31:38 +0000

Ich beantworte Ihre Frage, indem ich Ihnen eine andere stelle:

Wie zählt man an den Fingern bis 6?

Man zählt wahrscheinlich mit einer Hand bis zur größtmöglichen Zahl, und dann geht man zur zweiten Hand über, wenn einem die Finger ausgehen. Computer tun dasselbe: Wenn sie einen Wert darstellen müssen, der größer ist als ein einzelnes Register halten kann, verwenden sie mehrere 32-Bit-Blöcke, um mit den Daten zu arbeiten.

395
395
395
2014-01-07 20:36:34 +0000

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 Art und Weise, wie sie auf Ihrem Bildschirm erscheint, sind jedoch zwei völlig verschiedene Dinge. Die gedruckte Zeichenfolge “10000000000000000” wird nicht durch eine 32-Bit-Ganzzahl im Speicher dargestellt.

Um die Zahl “10000000000000000” 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, sondern kann einzeln als ASCII-Zeichen interpretiert werden (z.B. wird das Zeichen “0” durch den Dezimalwert 48, den Binärwert 00110000 repräsentiert), sie können in einem Format aneinandergereiht werden, das für Sie, einen Menschen, Sinn macht.


Ein verwandtes Konzept in der Programmierung ist Typecasting, d.h. wie ein Computer einen bestimmten Strom von 0s und 1s interpretiert. Wie im obigen Beispiel kann es als ein numerischer Wert, ein Zeichen oder sogar als etwas ganz anderes interpretiert werden. Während eine 32-Bit-Ganzzahl vielleicht nicht in der Lage ist, einen Wert von 10000000000000000 zu halten, kann eine 32-Bit-Gleitkommazahl dies unter Verwendung einer völlig anderen Interpretation.

Was die Art und Weise betrifft, wie Computer intern mit großen Zahlen arbeiten und sie verarbeiten können, so gibt es 64-Bit-Ganzzahlen (die Werte von bis zu 16 Milliarden Milliarden aufnehmen können), Gleitkommazahlen sowie spezialisierte Bibliotheken, die mit beliebig großen Zahlen arbeiten können.

190
Advertisement
190
190
2014-01-07 21:37:16 +0000

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 (d.h. Operationen 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, sie können also Zahlen von 0 bis 2³²-1 in einem Wort speichern.

Zweitens sind 1 Billion und 1000000000000000000 zwei verschiedene Dinge.

  • 1 Billion ist ein abstrakter Begriff von Zahl
  • 10000000000000000 ist Text

Durch einmaliges Drücken von 1 und dann 12-mal 0 tippt man Text ein. 1 gibt 1 ein, 0 gibt 0 ein. Sehen Sie? Sie tippen Zeichen ein. Zeichen sind keine Zahlen. Schreibmaschinen hatten überhaupt keine CPU oder Speicher, und sie konnten mit solchen “Zahlen” ziemlich gut umgehen, weil es nur Text ist.

Beweis, dass 100000000000000 keine Zahl ist, sondern Text: es kann 1 Billion (dezimal), 4096 (binär) oder 281474976710656 (hexadezimal) bedeuten. In verschiedenen Systemen hat sie noch mehr Bedeutungen. Die Bedeutung von 1000000000000000000 ist eine Zahl, und sie zu speichern ist eine andere Geschichte (wir kommen gleich darauf zurück).

Um den Text zu speichern (in der Programmierung heißt er String) 1000000000000000000 benötigt man 14 Bytes (eines für jedes Zeichen plus ein abschließendes NULL-Byte, das im Grunde genommen bedeutet “der String endet hier”). Das sind 4 Maschinenwörter. 3 und die Hälfte würden ausreichen, aber wie ich schon sagte, Operationen auf Maschinenwörtern sind am schnellsten. Nehmen wir an, ASCII wird zur Textspeicherung verwendet, so dass es im Speicher folgendermaßen aussieht: (Konvertierung von ASCII-Codes, die 0 und 1 entsprechen, in Binärcodes, jedes Wort in einer separaten Zeile)

00110001 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00000000 00000000 00000000

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 Zahlen. Es funktioniert genau wie bei überlaufendem Text, aber sie werden von rechts nach links eingepasst. Es mag kompliziert klingen, deshalb hier ein Beispiel. Der Einfachheit halber nehmen wir an:

  • unser imaginärer Computer verwendet dezimal statt binär
  • ein Byte kann Zahlen enthalten 0..9
  • ein Wort besteht aus zwei Bytes

Hier ist ein leerer 2-Wort-Speicher:

0 0
0 0

Speichern wir die Zahl 4:

0 4
0 0

Nun fügen wir 9 hinzu:

1 3
0 0

Beachten Sie, dass beide Operanden in ein Byte passen würden, aber nicht das Ergebnis. Aber wir haben noch einen weiteren zur Verwendung bereit. Lassen Sie uns nun 99 speichern:

9 9
0 0

Wieder haben wir das zweite Byte zur Speicherung der Zahl verwendet. Fügen wir 1 hinzu:

0 0
0 0

Hoppla… Das nennt man ganzzahligen Überlauf und ist eine Ursache für viele ernsthafte Probleme, manchmal sehr teure .

Aber wenn wir erwarten, dass es zu einem Überlauf kommt, können wir das tun:

0 0
9 9

Und jetzt fügen Sie 1 hinzu:

0 1
0 0

Es wird klarer, wenn Sie bytetrennende Leerzeichen und Zeilenumbrüche entfernen:

0099 | +1
0100

Wir haben vorhergesagt, dass es zu einem Überlauf kommen kann und wir möglicherweise zusätzlichen Speicher benötigen. Die Behandlung von Zahlen auf diese Weise ist nicht so schnell wie bei Zahlen, die in einzelne Wörter passen, und sie muss in Software implementiert werden. Wenn man einer 32-Bit-CPU die Unterstützung für Zwei-32-Bit-Wort-Zahlen hinzufügt, wird sie effektiv zu einer 64-Bit-CPU (jetzt kann sie nativ mit 64-Bit-Zahlen arbeiten, nicht wahr?)

Alles, was ich oben beschrieben habe, gilt auch für binären Speicher mit 8-Bit-Bytes und 4-Byte-Wörtern, es funktioniert ziemlich genau so:

00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 | +1
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

Konvertieren solcher Zahlen […]

40
40
40
2014-01-07 23:06:37 +0000

Sie sind auch in der Lage, “DIESE ERKLÄRUNG IST FALSCH” zu schreiben, ohne dass Ihr Computer abstürzt :) @Scotts Antwort ist genau richtig für bestimmte Berechnungsrahmen, aber Ihre Frage nach dem “Schreiben” einer großen Zahl impliziert, daß sie nur einfacher Text ist, zumindest bis sie interpretiert wird.

Edit: jetzt mit ~weniger Sarkasmus~ nützlichere Informationen über verschiedene Möglichkeiten, wie eine Zahl im Speicher gespeichert werden kann. Ich werde diese mit höherer Abstraktion beschreiben, d.h. in Begriffen, in denen ein moderner Programmierer möglicherweise Code hineinschreibt, bevor er zur Ausführung in Maschinencode übersetzt wird.

Daten auf einem Computer müssen auf einen bestimmten Typ beschränkt werden, und eine Computerdefinition eines solchen Typs beschreibt, welche Operationen mit diesen Daten durchgeführt werden können und wie (d.h. Zahlen vergleichen, Text verknüpfen oder XOR ein boolesches XOR). Man kann nicht einfach Text zu einer Zahl hinzufügen, genauso wenig wie man eine Zahl mit Text multiplizieren kann, damit einige dieser Werte zwischen den Typen konvertiert werden können.

Beginnen wir mit ganzen Zahlen ohne Vorzeichen. In diesen Werttypen werden alle Bits verwendet, um Informationen über Ziffern zu speichern; Ihres ist ein Beispiel für eine 32-Bit-Ganzzahl ohne Vorzeichen, in der jeder Wert von 0 bis 2^32-1 gespeichert werden kann. Und ja, je nach Sprache oder Architektur der verwendeten Plattform könnten Sie 16-Bit-Ganzzahlen oder 256-Bit-Ganzzahlen haben.

Was ist, wenn Sie negativ werden wollen? Intuitiv gesehen sind vorzeichenbehaftete Ganzzahlen der Name des Spiels. Die Konvention besteht darin, alle Werte von -2^(n-1) bis 2^(n-1)-1 zuzuordnen - auf diese Weise vermeiden wir die Verwirrung, mit zwei Schreibweisen von +0 und -0 umgehen zu müssen. Eine vorzeichenbehaftete 32-Bit-Ganzzahl würde also einen Wert von -2147483648 bis 2147483647 enthalten. Toll, nicht wahr?

Ok, wir haben Ganzzahlen behandelt, die Zahlen ohne Dezimalkomponente sind. Diese auszudrücken ist schwieriger: der nicht ganzzahlige Teil kann sinnvollerweise nur irgendwo zwischen 0 und 1 liegen, so dass jedes zusätzliche Bit, das zur Beschreibung verwendet wird, seine Genauigkeit erhöhen würde: ½, ¼, 1/8… Das Problem ist, dass man eine einfache Dezimalzahl 0.1 nicht präzise als Summe von Brüchen ausdrücken kann, die nur Zweierpotenzen im Nenner haben können! Wäre es nicht viel einfacher, die Zahl als ganze Zahl zu speichern, aber stattdessen das Radix-(Dezimal-)Komma zu verwenden? Dies nennt man Festkommazahlen, wobei wir 1234100 speichern, uns aber auf eine Konvention einigen, es stattdessen als 1234.100 zu lesen.

Ein relativ häufigerer Typ, der für Berechnungen verwendet wird, ist floating point. Die Funktionsweise ist wirklich ordentlich, er verwendet ein Bit zur Speicherung des Vorzeichenwertes, dann ein Bit zur Speicherung von Exponent und Signifikant. Es gibt Standards, die solche Zuweisungen definieren, aber bei einem 32-Bit-Fließkommazahl ist die maximale Anzahl, die Sie speichern könnten, eine überwältigende

(2 - 2^-23) * 2^(2^7 - 1) ≈ 3.4 * 10^38

Dies geht jedoch auf Kosten der Genauigkeit. In Browsern verfügbares JavaScript verwendet 64-Bit-Fließkommazahlen, und es kann immer noch nicht alles richtig machen. Kopieren Sie dies einfach in die Adressleiste und drücken Sie die Eingabetaste. Spoiler-Alarm: das Ergebnis ist nicht 0.3.

javascript:alert(0.1+0.2);

Es gibt weitere alternative Typen wie Microsoft .NET 4.5’s BigInteger , das theoretisch keine oberen oder unteren Grenzen hat und in “Batches” berechnet werden muß; aber vielleicht sind die faszinierenderen Technologien diejenigen, die Mathematik verstehen, wie die Wolfram Mathematica-Engine, die präzise mit abstrakten Werten wie unendlich arbeiten kann.

31
Advertisement
31
31
2014-01-07 21:58:50 +0000

Der Schlüssel ist das Verständnis, wie Computer _Zahlen _kodieren.

Wenn ein Computer darauf besteht, Zahlen unter Verwendung einer einfachen binären Darstellung der Zahl unter Verwendung eines einzigen Wortes (4 Byte auf einem 32-Bit-System) zu speichern, dann 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 man mit ihnen erreichen will.

Ein Beispiel ist die Speicherung von Gleitkommazahlen auf Computern. Computer können eine ganze Reihe verschiedener Möglichkeiten nutzen, um sie zu kodieren. Der Standard IEEE 754 definiert Regeln für die Kodierung von Zahlen größer als 2^32. Grob gesagt können Computer dies implementieren, indem sie die 32 Bits in verschiedene Teile unterteilen, die einige Ziffern der Zahl und andere Bits, die die Größe der Zahl (d. h. den Exponenten 10^x) darstellen. Dies erlaubt einen viel größeren Größenbereich von Zahlen, beeinträchtigt aber die Präzision (was für viele Zwecke in Ordnung ist). Natürlich kann der Computer auch mehr als ein Wort für diese Kodierung verwenden, was die Genauigkeit der Größenordnung der verfügbaren kodierten Zahlen erhöht. Die einfache dezimale 32-Version des IEEE-Standards erlaubt Zahlen mit einer Genauigkeit von etwa 7 Dezimalstellen und Zahlen bis zu einer Größe von etwa 10^96.

Aber es gibt viele andere Optionen, wenn Sie die zusätzliche Genauigkeit benötigen. Offensichtlich können Sie unbegrenzt mehr Wörter in Ihrer Kodierung verwenden (allerdings mit einem Leistungseinbruch bei der Konvertierung in das kodierte Format und aus dem kodierten Format heraus). Wenn Sie eine Möglichkeit erkunden möchten, wie dies erreicht werden kann, gibt es ein großartiges Open-Source-Add-In für Excel, das ein Kodierungsschema verwendet, das Hunderte von Ziffern für die Genauigkeit der Berechnung zulässt. Das Add-In heißt Xnumbers und ist erhältlich hier . Der Code ist in Visual Basic, was nicht der schnellstmögliche ist, aber den Vorteil hat, dass er leicht zu verstehen und zu modifizieren ist. Es ist eine gute Möglichkeit zu lernen, wie Computer die Kodierung längerer Zahlen erreichen. Und Sie können mit den Ergebnissen in Excel herumspielen, ohne Programmierwerkzeuge installieren zu müssen.

24
24
24
2014-01-07 23:47:36 +0000

Es ist alles in Ihrer Frage.

Sie können jede beliebige Zahl auf Papier schreiben. Versuchen Sie, eine Billion Punkte auf ein weißes Blatt Papier zu schreiben. Das ist langsam und wirkungslos. 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, damit Sie nicht one one one one one one one one one one one... laut sagen.

32-Bit-Prozessoren sind so konzipiert, dass sie am schnellsten und effizientesten mit Speicherblöcken arbeiten, die genau 32 Binärziffern lang sind. Aber wir Menschen verwenden üblicherweise ein 10-stelliges numerisches System, und Computer, die elektronisch sind, verwenden ein 2-stelliges System binär ). Die Zahlen 32 und 64 sind zufällig 2er-Potenzen, eine Million und eine Billion sind 10er-Potenzen. Es ist einfacher für uns, mit diesen Zahlen zu arbeiten als zum Beispiel mit Mengen von 65536.

Große Zahlen zerlegen wir in Ziffern, wenn wir sie auf Papier schreiben. Computer zerlegen Zahlen in eine größere Anzahl von Ziffern. Wir können jede beliebige Zahl aufschreiben, und die Computer können das auch, wenn wir sie so gestalten.

15
Advertisement
15
15
2014-01-08 00:42:45 +0000

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 Speicherplätze in Ihrem RAM (Random Access Memory) zu adressieren. Als die CPU nur 16-Bit-Adressen verarbeiten konnte, konnten Sie nur 32 MB RAM verwenden (was damals riesig erschien). Mit 32bit ging es zu 4+gb (was zu der Zeit riesig erschien). Jetzt, wo wir 64-Bit-Adressen haben, geht der RAM-Speicher in Terabyte (was riesig erscheint). Das Programm ist jedoch in der Lage, mehrere Speicherblöcke für Dinge wie das Speichern von Zahlen und Text zuzuweisen, das ist Sache des Programms und hängt nicht von der Größe der einzelnen Adressen ab. Damit ein Programm der CPU mitteilen kann, dass ich 10 Adressblöcke zur Speicherung verwende und dann eine sehr große Zahl oder eine Zeichenfolge mit 10 Buchstaben oder was auch immer speichere. Nebenbemerkung: Auf Speicheradressen wird mit “Zeigern” verwiesen, also bedeutet der 32- und 64-Bit-Wert die Größe des Zeigers, der für den Zugriff auf den Speicher verwendet wird.

13
13
13
2014-01-08 06:44:38 +0000

Denn die Anzeige der Nummer erfolgt mit einzelnen Zeichen, nicht mit ganzen Zahlen. Jede Ziffer in der Zahl wird durch ein separates Zeichenliteral dargestellt, dessen ganzzahliger Wert durch die verwendete Kodierung definiert ist, z.B. wird 'a' durch den Ascii-Wert 97 dargestellt, während '1' durch 49 dargestellt wird. Prüfen Sie die ascii-Tabelle hier . Für die Anzeige von ‘a’ und ‘1’ ist die Darstellung gleich. Sie sind Zeichenliterale, keine ganzen Zahlen. Jedes Zeichenliteral darf in einer 32-Bit-Plattform einen maximalen Wert von 255 haben, wobei der Wert in 8-Bit- oder 1-Byte-Größe gespeichert wird (das ist plattformabhängig, 8 Bit ist jedoch die gebräuchlichste Zeichengröße), so dass sie gruppiert und angezeigt werden können. Wie viele einzelne Zeichen sie anzeigen können, hängt vom RAM-Speicher ab, über den Sie verfügen. Wenn Sie nur 1 Byte RAM haben, dann können Sie nur ein Zeichen anzeigen, wenn Sie 1 GB RAM haben, dann können Sie gut 1024*1024*1024 Zeichen anzeigen (zu faul zum Rechnen).

Diese Einschränkung gilt jedoch für die Berechnungen, aber ich nehme an, Sie interessieren sich für den IPV4-Standard. Obwohl er nicht ganz mit bit-size von Computern zu tun hat, hat er irgendwie die Standards beeinflusst. Als der IPV4-Standard erstellt wurde, speicherten sie die ip-Werte in 32-Bit-Ganzzahlen. Nun, sobald man die Größe angab, wurde es zum Standard. Alles, was wir über das Internet wissen, hing davon ab, und dann gingen uns die IP-Adressen zum Zuweisen aus. Wenn also der IP-Standard überarbeitet wurde, um 64 Bit zu haben, wird alles einfach nicht mehr funktionieren, einschließlich Ihres Routers (ich gehe davon aus, dass dies korrekt ist) und anderer Netzwerkgeräte. Es muss also ein neuer Standard geschaffen werden, der einfach die 32-Bit-Ganzzahl mit der 128-Bit-Ganzzahl vertauscht. Und den Rest des Standards angepasst. Die Hardware-Hersteller müssen nur noch erklären, dass sie diesen neuen Standard unterstützen, und schon wird es viral. Obwohl es nicht so einfach ist, aber ich schätze, Sie haben den Punkt hier verstanden.

Haftungsausschluss: Die meisten der hier erwähnten Punkte stimmen mit meiner Annahme überein. Vielleicht habe ich hier wichtige Punkte übersehen, um es einfacher zu machen. Ich kann nicht gut mit Zahlen umgehen, also habe ich wohl einige Ziffern übersehen, aber ich möchte hier auf die Antwort des OPs antworten, warum er den PC nicht zum Absturz bringt.

13
Advertisement
13
13
2014-01-08 11:27:08 +0000

In Prozessoren gibt es “Wörter”. Es gibt verschiedene Wörter. Wenn Leute “32-Bit-Prozessor” sagen, meinen sie meist “Speicherbusbreite”. Dieses Wort besteht aus verschiedenen “Feldern”, die sich auf Subsysteme des Computers beziehen, die der Übertragung (24 Bit) und der Steuerung (andere Bits) entsprechen. Ich kann mich bei genauen Zahlen irren, vergewissern Sie sich anhand von Handbüchern.

Ein ganz anderer Aspekt ist die Berechnung. SSE- und MMX-Befehlssätze können lange ganze Zahlen speichern. Die maximale Länge ohne Produktivitätsverlust hängt von der aktuellen SSE-Version ab, aber es handelt sich immer um ein Vielfaches von 64 Bits.

Aktuelle Opteron-Prozessoren können 256 Bit breite Zahlen verarbeiten (bei Integer bin ich mir nicht sicher, aber Float ist sicher).

Zusammenfassung : (1) die Busbreite ist nicht direkt mit der Rechenbreite verbunden, (2) selbst verschiedene Wörter (Speicherwort, Registerwort, Buswort usw.) sind nicht miteinander verbunden, außer sie haben einen gemeinsamen Divisor von 8 oder 16 oder 24. Viele Prozessoren verwendeten sogar 6-Bit-Wort (aber seine Geschichte).

10
10
10
2014-01-08 20:39:13 +0000

Der Zweck eines Computergeräts besteht im Allgemeinen darin, Daten anzunehmen, zu verarbeiten, zu speichern und zu senden. Die zugrunde liegende Hardware ist lediglich eine Maschine, die bei der Ausführung dieser vier Funktionen hilft. Ohne Software kann sie keine dieser Funktionen ausführen.

Software ist der Code, der der Maschine sagt, wie sie Daten annimmt, verarbeitet, speichert und anderen zur Verfügung stellt.

Die zugrundeliegende Hardware wird immer Einschränkungen haben. Im Falle einer 32-Bit-Maschine sind die meisten Register, die Daten verarbeiten, nur 32 Bit breit. Das bedeutet jedoch nicht, dass die Maschine nicht mit Zahlen jenseits von 2^32 umgehen kann, es bedeutet, dass die Maschine, wenn Sie mit größeren Zahlen umgehen wollen, möglicherweise mehr als einen Zyklus braucht, um sie anzunehmen, zu verarbeiten, zu speichern oder auszugeben.

Die Software sagt der Maschine, wie sie mit Zahlen umgehen soll. Wenn die Software für den Umgang mit großen Zahlen ausgelegt ist, sendet sie eine Reihe von Anweisungen an die CPU, die ihr sagen, wie sie mit den größeren Zahlen umgehen soll. Ihre Zahl kann zum Beispiel durch zwei 32-Bit-Register dargestellt werden. Wenn Sie 1.234 zu Ihrer Zahl addieren wollten, würde die Software der CPU mitteilen, zuerst 1.234 zum unteren Register zu addieren und dann das Überlaufbit zu überprüfen, um zu sehen, ob diese Addition zu einer Zahl führte, die zu groß für das untere Register ist. Wenn ja, dann addiert sie 1 zum oberen Register.

Auf die gleiche Weise, wie Grundschulkindern beigebracht wird, mit Übertrag zu addieren, kann der CPU gesagt werden, dass sie mit Zahlen umgehen soll, die größer sind, als sie in einem einzelnen Register halten kann. Dies gilt für die meisten allgemeinen mathematischen Operationen, für Zahlen jeder praktischen Größe.

8
Advertisement
8
8
2014-01-09 15:18:54 +0000

32-Bit-Computer können nur Zahlen bis zu 2^32 in einem einzigen Maschinenwort speichern, was aber nicht bedeutet, dass sie nicht mit größeren Dateneinheiten umgehen 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 auf einmal verarbeiten und vier Byte Daten auf einmal über den Datenbus senden kann.

Das hindert den Computer jedoch nicht daran, mehr Daten zu verarbeiten, er muss die Daten nur in vier Byte-Blöcke aufteilen, wenn sie über den Datenbus gesendet werden.

Der reguläre 32-Bit-Prozessor von Intel kann intern 128-Bit-Zahlen verarbeiten, so dass Zahlen wie 10000000000000000000000000000000000000000000000000000000000000000 problemlos verarbeitet werden können.

Sie können viel größere Zahlen als die in einem Computer handhaben, aber dann müssen die Berechnungen per Software durchgeführt werden, die CPU hat keine Anweisungen zur Handhabung von Zahlen größer als 128 Bit. (Sie kann viel größere Zahlen in Form von Fließkommazahlen verarbeiten, aber dann hat man nur 15 Stellen Genauigkeit).

6
6
6
2014-01-10 19:11:43 +0000

Ich füge nur eine Anmerkung zu den vielen anderen Antworten hinzu, denn dies ist eine ziemlich wichtige Tatsache in dieser Frage, die übersehen wurde.

“32 Bit” bezieht sich auf die Breite der Speicheradresse. 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 neueren Verbraucher-CPUs, die alle 64 Bit haben, für spezielle Zwecke über bis zu 256 Bit Register.

Dieser Unterschied zwischen der Registerbreite und der Adressbreite besteht seit der Antike, als wir 4 Bit-Register und 8 Bit-Adressen hatten, oder umgekehrt.

Es ist einfach zu sehen, dass die Speicherung einer großen Zahl unabhängig von der Registergröße kein Problem darstellt, wie in anderen Antworten erklärt wird.

Der Grund dafür, dass die Register, egal wie groß sie zufällig sind, zusätzlich auch mit größeren Zahlen rechnen können, liegt darin, dass zu große Berechnungen in mehrere kleinere zerlegt werden können, die in die Register passen (in Wirklichkeit ist es nur etwas komplizierter).

6
Advertisement
6
6
2014-01-10 21:36:01 +0000

Die bereits gegebenen Antworten sind eigentlich recht gut, aber sie tendieren dazu, das Thema von verschiedenen Seiten zu beleuchten und somit ein unvollständiges Bild zu zeichnen. Sie sind meiner Meinung nach auch ein wenig zu technisch.

Also, nur um etwas zu klären, das in den anderen Antworten angedeutet, aber nicht explizit ausgedrückt wird und das meiner Meinung nach der springende Punkt ist:

Sie vermischen in Ihrer Frage mehrere Konzepte , und eines davon (“32 bit”) kann sich tatsächlich auf eine Vielzahl verschiedener Dinge beziehen (und verschiedene Antworten haben unterschiedliche Interpretationen angenommen). Diese Konzepte haben alle etwas mit der Anzahl der Bits (1er und 0er) zu tun, die in verschiedenen Computerkontexten verwendet werden (oder verfügbar sind) (was ich damit meine, wird hoffentlich durch die folgenden Beispiele verdeutlicht), aber die Konzepte sind nicht miteinander verwandt.

Explizit:

  • “IPv4/6” bezieht sich auf Internetprotokoll , ein Regelwerk, das definiert, wie Informationen im Internet verpackt und interpretiert werden sollen. Die primäre (oder zumindest die bekannteste) Unterscheidung zwischen IPv4 und IPv6 besteht darin, dass der Adressraum (d.h. die Menge der Adressen, die zur Unterscheidung zwischen verschiedenen Orten im Netz verwendet werden kann) bei IPv6 größer ist. Dies hängt damit zusammen, wie viele Bits in jedem Datenpaket, das über das Netzwerk gesendet wird, zugewiesen (d.h. für den Zweck reserviert) werden, um den Absender und den beabsichtigten Empfänger des Pakets zu identifizieren.
  • Nicht-rechnerische Analogie: Jedes Paket ist wie ein Brief, der per Schneckenpost verschickt wird, und der Adreßraum entspricht der Anzahl der Zeichen, die Sie “verwenden” dürfen, wenn Sie die Adresse und die Rücksendeadresse auf den Umschlag schreiben.
  • Ich sehe dies bisher in keiner der anderen Antworten erwähnt.
  • Computer-Speicher-“Wörter” (32-Bit und 64-Bit) kann man sich im allgemeinen als das kleinste Stück Daten vorstellen, das ein Computer benutzt oder in dem er “denkt”. Diese Datenbits fügen sich zu anderen Datenbits zusammen, z.B. zu Textstücken oder größeren ganzen Zahlen.
  • Nicht-computerische Analogie: Wörter kann man sich ein bisschen wie Buchstaben vorstellen, aus denen Wörter auf Papier bestehen, oder sogar als einzelne Wörter in einem Gedankengang.
  • Siehe Guffa’s Antwort , sanaris’s Antwort , und den ersten Absatz von gronostaj’s Antwort .
  • 32-Bit-{Zeiger} können Wörter sein oder auch nicht, aber sie werden dennoch atomar behandelt (d.h. als einzelne Einheiten, die nicht in kleinere Bestandteile zerlegt werden können). Zeiger sind die unterste Ebene, auf der ein Computer die Speicherstelle eines beliebigen Datenblocks aufzeichnen kann. Beachten Sie, dass die vom Computer (oder eigentlich vom Betriebssystem) verwendete Zeigergröße den Bereich des Speichers, auf den ein einzelner Zeiger zugreifen kann, begrenzt, da es nur so viele mögliche Speicherorte gibt, auf die ein Zeiger “zeigen” kann, wie es mögliche Werte für den Zeiger selbst gibt. Dies ist analog zu der Art und Weise, in der IPv4 den Bereich der möglichen Internet-Adressen begrenzt, aber nicht die Datenmenge, die z.B. in einer bestimmten Webseite vorhanden sein kann. Die Größe des Zeigers begrenzt jedoch nicht die Größe der Daten selbst, auf die der Zeiger zeigen kann. (Ein Beispiel für ein Schema, bei dem die Datengröße den Zeigerbereich überschreiten kann, finden Sie in Linux unter inode pointer structure . Beachten Sie, dass dies eine etwas andere Verwendung des Wortes “Zeiger” ist als üblich, da sich Zeiger normalerweise auf einen Zeiger auf Arbeitsspeicher und nicht auf Festplattenspeicher beziehen)
  • Nicht-Computer-Analogie: hmmmmmm…..diese ist ein bisschen knifflig. Vielleicht ist das Dewey-Dezimalsystem für die Indexierung von Bibliotheksmaterialien ein wenig ähnlich? Oder wirklich irgendein Indexierungssystem.
  • Siehe SiteNook’s Antwort .
  • Bitte beachten Sie, dass meine Erklärung der obigen Zeiger einige subtile Details auslässt und wohl nicht ganz korrekt ist. In Programmiersprachen, in denen Programmierer direkt mit Zeigern arbeiten, ist jedoch der von mir gezeichnete mentale Modus für praktische Zwecke gewöhnlich ausreichend.
  • Die Zahlen, die ein Computer “anzeigen kann ” , sind (für praktische Zwecke) nicht durch die Hardware oder das Betriebssystem des Computers begrenzt; sie werden wie jeder andere Text behandelt.
  • Nicht-Computer-Analogie: Schreiben auf ein Blatt Papier
  • Siehe user1306322’s answer und Bigbio2002’s answer

Beachten Sie, dass dies keine umfassende Liste von Interpretationen für die Phrase “32 bit” sein soll.

Extra-Credit: Um wirklich die nackte philosophische Unterscheidung zwischen Zahlen und primitiven Brocken von Computerspeicher zu sehen, lesen Sie ein wenig über Turing machines .

5
5
5
2014-01-11 23:24:10 +0000

In Ihrem Kopf kennen Sie nur 10 verschiedene Ziffern. 0 bis 9. Intern in Ihrem Gehirn ist dies sicherlich anders kodiert als in einem Computer.

Ein Computer verwendet Bits, um Zahlen zu kodieren, aber das ist nicht wichtig. Das ist nur die Art und Weise, wie Ingenieure sich entschieden haben, Dinge zu kodieren, aber das sollten Sie ignorieren. Man kann es sich so vorstellen, dass ein 32-Bit-Computer eine eindeutige Darstellung von mehr als 4 Milliarden verschiedenen Werten hat, während wir Menschen eine eindeutige Darstellung für 10 verschiedene Werte haben.

Wann immer wir eine größere Zahl begreifen müssen, verwenden wir ein System. Die ganz linke Zahl ist die wichtigste. Sie ist zehnmal wichtiger als die nächste.

Ein Computer, der in der Lage ist, zwischen vier Milliarden verschiedenen Werten zu unterscheiden, muss in ähnlicher Weise dafür sorgen, dass der am weitesten links stehende Wert in einem Satz von Werten vier Milliarden Mal so wichtig ist wie der nächste Wert in diesem Satz. Eigentlich kümmert sich ein Computer überhaupt nicht darum. Er misst den Zahlen keine “Bedeutung” bei. Programmierer müssen dafür einen speziellen Code erstellen.

Wann immer ein Wert größer wird als die Anzahl der eindeutigen Symbole, 9 im menschlichen Verstand, addiert man eine Eins zu der Zahl links.

3+3=6

In diesem Fall passt die Zahl immer noch in einen einzigen “Slot”

5+5=10. This situation is called an overflow.

Also haben Menschen immer mit dem Problem zu kämpfen, dass sie nicht genügend eindeutige Symbole haben. Wenn der Computer nicht über ein System verfügt, das damit umgehen kann, würde er einfach 0 schreiben und vergessen, dass es eine zusätzliche Zahl gibt. Glücklicherweise haben Computer ein “Überlauf-Flag”, das in diesem Fall angehoben wird.

987+321 is more difficult.

Sie haben vielleicht in der Schule eine Methode gelernt. Einen Algorithmus. Der Algorithmus ist recht einfach. Man beginnt, indem man die beiden ganz linken Symbole addiert.

7+1=8, we now have ...8 as the result so far

Dann geht man zum nächsten Slot und führt dieselbe Addition durch.

8+2=10, the overflow flag is raised. We now have ...08, plus overflow.

Da wir einen Überlauf hatten, bedeutet das, dass wir zur nächsten Zahl 1 addieren müssen.

9+3=12, and then we add one due to overflow. ...308, and we had another overflow.

Es gibt keine Zahlen mehr zu addieren, also erstellen wir einfach einen Slot und fügen 1 ein, weil das Überlauf-Flag gesetzt wurde.

1308

Ein Computer macht es genau gleich, außer dass er 2^32 oder noch besser 2^64 verschiedene Symbole hat, statt nur 10 wie der Mensch.

Auf Hardware-Ebene arbeitet der Computer mit einzelnen Bits nach genau derselben Methode. Zum Glück wird das für Programmierer abstrahiert. Bits sind nur zweistellig, denn das lässt sich leicht in einer Stromleitung darstellen. Entweder ist das Licht an, oder es ist aus.

Schließlich könnte ein Computer jede Zahl als einfache Zeichenfolge darstellen. Genau das können Computer am besten. Der Algorithmus zur Umwandlung zwischen einer Zeichenfolge und einer internen Darstellung ist recht komplex.

5
Advertisement
5
5
2014-01-11 17:59:58 +0000

Für den Fall, dass Sie ein praktisches Beispiel dafür haben möchten, wie viele Programme auf einem typischen Linux-System eine große Anzahl von Programmen verarbeiten und ausgeben:

libgmp - Die GNU Multiple Precision Arithmetic Library ist die am weitesten verbreitete Bibliothek für diesen Zweck auf Linux-Systemen. Ein einfaches Beispiel für die Multiplikation von 2^80 mit 1000:

#include <gmp.h>

// Each large integer uses the mpz_t type provided by libgmp
mpz_t a_large_number;
mpz_t base;
mpz_t result;

// Initalize each variable
mpz_init(a_large_number);
mpz_init(base);
mpz_init(result);

// Assign the number 2 to the variable |base|
mpz_set_ui(base, 2);

// Raise base^80 (2^80), store the result in |a_large_number|
mpz_pow_ui(a_large_number, base, 80);

// Multiply |a_large_number| by 1000, store the result in |result|
mpz_mul_ui(result, a_large_number, 1000);

// Finally, output the result in decimal and hex notation
gmp_printf("decimal: %Zd, hex: %ZX\n", result, result);

Es ist also im Grunde das Gleiche wie die Verwendung der normalen + - * / Operatoren, nur mit einer Bibliothek, um die Zahlen aufzubrechen und sie intern als Zahlen in der Größe mehrerer Maschinenwörter (d.h. 32-Bit) zu speichern. Es gibt auch Funktionen vom Typ scanf() zur Behandlung der Umwandlung von Texteingaben in Ganzzahl-Typen.

Die Struktur von mpz_t ist genau wie Scott Chamberlains Beispiel des Zählens bis 6 mit zwei Händen. Es handelt sich im Grunde um eine Reihe von mp_limb_t-Typen in Maschinenwortgröße, und wenn eine Zahl zu groß ist, um in ein Maschinenwort zu passen, verwendet GMP mehrere mp_limb_t, um die Hoch/Tief-Teile der Zahl zu speichern.

5
5
5
2014-01-09 16:36:20 +0000

Wenn Sie z.B. 10000000000000000 in einen Taschenrechner schreiben, berechnet der Computer diese Zahl als eine Real type Zahl mit Dezimalpunkt. Das von Ihnen erwähnte Limit für 32 Bits berührt eher alle Zahlen vom Typ Ganzzahl ohne Dezimalpunkt. Unterschiedliche Datentypen verwenden unterschiedliche Methoden, wie man in Bits und Bytes gelangt.

Zahlen vom Typ Ganzzahl : Diese Tabelle könnte Ihnen helfen, den Punkt zu erfassen http://msdn.microsoft.com/en-us/library/296az74e.aspx ). Dies stößt an Grenzen für C++. Zum Beispiel Int64 Typennummer hat Grenzen von -9223372036854775808 bis 9223372036854775807.

Echte Typennummern : Reelle Typnummern enthalten Werte mit Fließkomma und Exponent, und Sie können viel größere Zahlen eingeben, jedoch mit begrenzter Genauigkeit/Präzision. http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) Zum Beispiel hat LDBL (large double) in C++ den maximalen Exponenten 308, also können Sie möglicherweise die Zahl 9.999 x 10^308 eingeben oder als Ergebnis die Zahl 9 haben, was bedeutet, dass Sie theoretisch 308(+1) Ziffern von &007 haben werden, aber nur die 15 wichtigsten Ziffern zur Darstellung verwendet werden, der Rest geht verloren, weil die Genauigkeit begrenzt ist.

Zusätzlich gibt es verschiedene Programmiersprachen und sie könnten unterschiedliche Implementierungen von Zahlengrenzen haben. Sie können sich also vorstellen, dass spezialisierte Anwendungen mit viel größeren (und/oder genaueren/präziseren) Zahlen umgehen könnten als C++.

3
Advertisement
3
3
2014-01-12 00:41:20 +0000

Weil Sie keine Zahl (soweit es den Computer betrifft), sondern eine Zeichenfolge oder eine Ziffernfolge anzeigen. Sicher, einige Anwendungen (wie z.B. der Taschenrechner, nehme ich an), die sich mit Zahlen beschäftigen, können mit einer solchen Zahl umgehen, nehme ich an. Ich weiß nicht, welche Tricks sie verwenden… Ich bin sicher, einige der anderen, ausführlicheren Antworten decken das ab.

0
0
0
2016-12-30 11:54:31 +0000

Der größte Teil des Inhalts dieser Antwort stammte ursprünglich von dieser Antwort (geschrieben vor dieser anderen Frage, die als Duplikat gekennzeichnet war). Ich diskutiere also die Verwendung von 8-Bit-Werten (auch wenn in dieser Frage nach 32-Bit-Werten gefragt wurde), aber das ist in Ordnung, denn 8-Bit-Werte sind konzeptionell einfacher zu verstehen, und dieselben Konzepte gelten auch für größere Werte wie die 32-Bit-Arithmetik.

Wenn Sie zwei Zahlen addieren, die 8 Bit sind, erhalten Sie die größte Zahl, die Sie erhalten können (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, also zweimal 8-Bit.

Nun nehmen Sie vielleicht an, dass ein x-Bit-Prozessor nur x-Bits verfolgen kann. (Zum Beispiel kann ein 8-Bit-Prozessor nur 8 Bits verfolgen.) Das ist nicht genau. Der 8-Bit-Prozessor empfängt Daten in 8-Bit-Blöcken (diese “Blöcke” 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: Die MUL-Anweisung 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 mehr als 8 Bits beträgt. Die CPU kann Ergebnisse wie dieses erzeugen: 0100 0000 0100 0010 xxxx xxxx xxxx xxxx xxxx 1101 0111 alias: 0x4082xxxxxxD7 Lassen Sie mich das für Sie interpretieren: 0x bedeutet lediglich, dass die folgenden Ziffern hexadezimal sind.
Auf die “40” werde ich gleich noch näher eingehen. 82 ist Teil des “A”-Registers, das eine Folge von 8 Bits ist. xx und xx sind Teil von zwei weiteren Registern, die als “B”-Register und “C”-Register bezeichnet werden. Der Grund dafür, daß ich diese Bits nicht mit Nullen oder Einsen aufgefüllt habe, liegt darin, daß ein “ADD”-Befehl (an die CPU gesendet) dazu führen kann, daß diese Bits durch den Befehl unverändert bleiben (während die meisten anderen Bits, die ich in diesem Beispiel verwende, mit Ausnahme einiger der Flagbits verändert werden können). D7 würde in mehr Bits passen, die als “D”-Register bezeichnet werden. Das “A”-Register ist nur ein Stück Speicher. Register sind in die CPUs 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 nun in die Register A und D aufgeteilt, anstatt in die Register A und B oder in die Register C und D? Nun, noch einmal, dies ist ein Beispielszenario, das ich benutze und das vom Konzept her einer echten Assemblersprache (Intel x86 16-Bit, wie sie von den Intel 8080 und 8088 und vielen neueren CPUs verwendet wird) ziemlich ähnlich sein soll. Es könnte einige gemeinsame Regeln geben, wie z.B. das “C”-Register, das typischerweise als Index für Zähloperationen verwendet wird (typisch für Schleifen), und das “B”-Register, das zur Verfolgung von Offsets verwendet wird, die bei der Angabe von Speicherplätzen helfen. Daher könnten “A” und “D” für einige der üblichen arithmetischen Funktionen gebräuchlicher sein.

Jeder CPU-Befehl sollte eine Dokumentation haben, die von Leuten verwendet wird, die in der Baugruppe programmieren. Diese Dokumentation sollte angeben, welche Register von jeder Anweisung verwendet werden. (Die Wahl, welche Register verwendet werden sollen, wird also oft von den Entwicklern der CPU festgelegt, nicht von den Assembler-Programmierern. Obwohl es eine gewisse Flexibilität geben kann)

Nun zurück zu den “40” im obigen Beispiel: das ist eine Reihe von Bits, oft als “Flags-Register” bezeichnet. Jedes Bit im Flags-Register hat einen Namen. Zum Beispiel gibt es ein “Überlauf”-Bit, das die CPU setzen kann, wenn das Ergebnis größer ist als der Platz, der ein Byte des Ergebnisses speichern kann. (Das “Überlauf”-Bit kann oft mit dem abgekürzten Namen “OF” bezeichnet werden. Das ist ein großes o, keine Null). Software kann auf den Wert dieses Flags prüfen und das “Problem” bemerken. Die Arbeit mit diesem Bit wird oft unsichtbar von höheren Sprachen gehandhabt, so dass Anfänger oft nicht lernen, wie mit den CPU-Flags zu interagieren ist. Assembler-Programmierer greifen jedoch häufig auf einige dieser Flags auf eine Art und Weise zu, die anderen Variablen sehr ähnlich ist.

Zum Beispiel könnten Sie mehrere ADD-Befehle haben. Ein ADD-Befehl könnte 16 Bit Ergebnisse im A-Register und im D-Register speichern, während ein anderer Befehl nur die 8 niedrigen Bits im A-Register speichert, das D-Register ignoriert und das Überlaufbit spezifiziert. Dann könnten Sie später (nach dem Speichern der Ergebnisse des A-Registers im Haupt-RAM) einen weiteren ADD-Befehl verwenden, der nur die 8 hohen Bits in einem Register (möglicherweise dem A-Register) speichert. Ob Sie ein Überlauf-Flag verwenden müssen, hängt möglicherweise davon ab, welchen Multiplikationsbefehl Sie verwenden.

(Üblicherweise gibt es auch ein “Unterlauf”-Flag, falls Sie zu viel subtrahieren, um in das gewünschte Ergebnis zu passen.)

Nur um Ihnen zu zeigen, wie kompliziert die Dinge wurden: Der Intel 4004 war eine 4-Bit-CPU Der Intel 8008 war eine 8-Bit-CPU. Er hatte 8-Bit-Register mit den Namen A, B, C und D. Der Intel 8086 war eine 16-Bit-CPU. Er verfügte über 16-Bit-Register namens AX, BX, CX und DX. Der Intel 80386 war eine 32-Bit-CPU. Er hatte 32-Bit-Register mit den Namen EAX, EBX, ECX und EDX. Die Intel x64-CPUs hatten 64-Bit-Register mit den Namen RAX, RBX, RCX und RDX. Die x64-Chips können 16-Bit-Code ausführen (in einigen Betriebsarten) und 16-Bit-Befehle interpretieren. Dabei sind die Bits, aus denen das AX-Register besteht, die Hälfte der Bits, aus denen das EAX-Register besteht, die die Hälfte der Bits sind, aus denen das RAX-Register besteht. Jedes Mal, 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 EAX um einen Wert ändern, der ein Vielfaches von 65.536 ist, bleiben die niedrigen 16 Bits unverändert, so dass AX sich nicht ändern würde. Wenn Sie EAX um einen Wert ändern, der kein Vielfaches von 65.536 ist, dann würde sich das auch auf AX auswirken)

Es gibt mehr Flags und Register als nur die von mir erwähnten. Ich habe einfach einige gebräuchliche ausgewählt, um ein einfaches konzeptionelles Beispiel zu geben.

Nun, wenn Sie auf einer 8-Bit-CPU arbeiten und in den Speicher schreiben, finden Sie vielleicht einige Einschränkungen bezüglich der Möglichkeit, sich auf eine Adresse von 8 Bits zu beziehen, nicht auf eine Adresse von 4 Bits oder 16 Bits. Die Einzelheiten hängen von der CPU ab, aber wenn Sie solche Einschränkungen haben, dann kann es sein, dass die CPU mit 8-Bit-Wörtern zu tun hat, weshalb die CPU am häufigsten als “8-Bit-CPU” bezeichnet wird.

Advertisement
Advertisement