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


369

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?


35
Die Frage ist fehlerhaft. 32-Bit-Computer können Zahlen verarbeiten, die viel größer als 2 ^ 32 sind. Sie machen es die ganze Zeit mit "lang" und so weiter. Sie können nur bis zu 2 ^ 32 in einem Register speichern, aber die Software wurde geschrieben, um dieses Problem zu umgehen. Einige moderne Sprachen haben nicht einmal ein Problem mit der Länge einer bestimmten Zahl.
JFA

23
Bitte halten Sie Kommentare zum Thema, höflich und relevant für die technischen Aspekte der Frage. Fast 50 Scherzkommentare mussten bereits entfernt werden, und wir möchten vermeiden, den Beitrag sperren zu müssen. Danke.
nhinkle

6
Diese Frage wurde ein bisschen schlampig geschrieben. Was meinst du mit "schreiben" und "anzeigen" der Nummer 1000000000000? Als Sie die Frage geschrieben haben, haben Sie die Nummer 1000000000000 geschrieben, und Ihr Webbrowser zeigt sie, wie ich annehme, einwandfrei an. Dies sollte jedoch für niemanden ungewöhnlich sein, der jemals zuvor einen Computer verwendet hat. Die Frage fragt nach freier Interpretation.
HelloGoodbye

7
Es wird geschätzt, dass das menschliche Bewusstsein ungefähr 50 Bits enthält (ich lese irgendwo). Die Frage lautet also nicht "Wie kann ich schreiben, 10^9ohne dass mein PC abstürzt?" sondern "Wie kann ich schreiben, 10^(18)ohne dass mein Gehirn abstürzt?"
Hagen von Eitzen

1
32-Bit-Computer können nur UNSIGNED-Ganzzahlen bis zu 2 ^ 32 - 1 speichern. 2 ^ 32 - 1 entspricht nicht einmal 2.147.483.647 ... 300 Up-Votes, und niemand hat dies bemerkt?
Koray Tugay

Antworten:


784

Ich beantworte Ihre Frage mit einer anderen:

Wie rechnen Sie mit Ihren Fingern bis 6?

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.


16
Komisch, @ Codename. Wie rechnen Sie dann mit 32 oder mehr Fingern (dh wenn 2 ^ 5 erschöpft sind)? ;) Die Analogie, sich auf die andere Hand zu bewegen, ist gut ... auch wenn sich die Notwendigkeit, sich auf die andere Hand zu bewegen, binär verzögert. Was ich sehen möchte, ist, bis 1.024 oder mehr zu zählen, mit der Fingerfertigkeit, bis zu 1.048.575 zu zählen! :) Das sind möglicherweise 20-Bit-Power auf der Tochterplatine. : P
J0e3gan

14
Bitte halten Sie Kommentare zum Thema und zur Diskussion der technischen Aspekte dieser Antwort relevant. Über 60 Scherzkommentare wurden bereits aus dieser Antwort gelöscht, und wir möchten vermeiden, den Beitrag sperren zu müssen.
nhinkle

@ Codename - einfach, Sie weisen einen Finger als Stapelzeiger zu. Sobald Sie keine Finger mehr haben, addieren Sie den Betrag zum Stapel und beginnen erneut zu zählen.
Makach

Wo hast du das gelernt, @codename? Ich habe das zuerst von Frederik Pohl gehört, siehe zB hier hjkeen.net/halqn/f_pohl3.htm
Zane

2
Ich denke, das ist nicht die Antwort auf die relevante Frage. Answer by @ Bigbio2002 ist die richtige. Hier ist "1000000000000" keine Zahl, sondern ein Text, genau wie "adsfjhekgnoregrebgoregnkevnregj". Was Sie sagen, ist wahr, aber ich bin der festen Überzeugung, dass dies nicht die richtige Antwort ist. Und um so viele positive Stimmen zu sehen ...
Master Chief

398

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 dargestellt 00110000) 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 0s und 1s. 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.


22
Eigentlich ist das meistens richtig aber nicht ganz. Es ist unwahrscheinlich, dass eine 32-Punkt-Gleitkommazahl 1000000000000 genau darstellen kann. Sie stellt eine Zahl dar, die der gewünschten Zahl sehr nahe kommt, aber nicht genau.
Tim B

6
@ TimB: Hast du schon vom decimal32 Format gehört? Es ist Teil des IEEE 754-2008-Standards. Dieses Format kann die angegebene Zahl korrekt wiedergeben :)
VX

15
Das stimmt. Dies ist jedoch nicht das Format, das Leute meinen, wenn sie "float" sagen, was sich normalerweise auf eine 32-Bit-Gleitkommazahl bezieht, wie sie von Standard-Gleitkommaprozessoren in aktuellen Computern gespeichert und verwendet wird.
Tim B.

2
@ TimB in der Tat. Die nächste Zahl, die als float32 dargestellt werden kann, ist 999999995904
greggo

4
@ TimB: Aber eine 64-Bit-Gleitkommazahl kann leicht 1000000000000genau darstellen. Es ist 10 ^ 12 oder 2 ^ 12 * 5 ^ 12; 5 ^ 12 benötigt 28 Bits Mantisse.
Keith Thompson

191

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.

  • 1 Billion ist ein abstrakter Begriff der Zahl
  • 1000000000000 ist Text

Durch 1einmaliges und dann 012- maliges Drücken geben Sie Text ein. 1Eingänge 1, 0Eingänge 0. 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 0und 1in Binärform, 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 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:

  • 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 Nummer 4:

0 4
0 0

Fügen wir nun 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 gebrauchsfertigen. Speichern wir nun 99:

9 9
0 0

Auch hier haben wir das zweite Byte verwendet, um die Nummer zu speichern. Fügen wir 1 hinzu:

0 0
0 0

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:

0 0
9 9

Und jetzt addiere 1:

0 1
0 0

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

0099    | +1
0100

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.

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

Das Konvertieren solcher Zahlen in ein Dezimalsystem ist jedoch schwierig. (aber es funktioniert ziemlich gut mit hexadezimal )


21
Ihre Antwort lautet eher herablassend. OP spricht deutlich über die Anzahl, nicht den Text: 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 ...
MirroredFate

12
"1 Billion" ist auch eine Zeichenfolge
Elzo Valugi

3
@ ElzoValugi Es ist. Ich musste einen Weg finden, das Konzept der abstrakten Zahl darzustellen, im Gegensatz zu einer Zeichenkette, die eine Zahl darstellt. Ich glaube, "1 Billion" ist ein besserer und weniger zweideutiger Weg, dies zu tun (siehe den Beweis in der Antwort).
Gronostaj

25
@ MirroredFate Ich bin nicht einverstanden mit "spricht eindeutig über die Nummer". OP sagt ‚angezeigt fein‘, die eindeutig ist , über den Text sprechen ‚1000000000000‘ mir ...
Joe

4
@yannbane 'A' ist ein Zeichen und keine Zahl. '?' ist ein Zeichen und keine Zahl. '1' ist ein Zeichen und keine Zahl. Zeichen sind nur Symbole. Sie können Ziffern oder Zahlen darstellen, aber definitiv keine Zahlen. '1' kann für eins, zehn, hundert, tausend usw. stehen. Es ist nur ein Symbol, das für eine Ziffer steht, die eine Zahl oder ein Teil davon sein kann. '10' (Zeichenfolge) kann zwei oder acht oder zehn oder sechzehn usw. bedeuten. Wenn Sie jedoch sagen, dass Sie zehn Äpfel haben, verwenden Sie eine Zehn und jeder weiß, was Sie meinen. Es gibt einen großen Unterschied zwischen Zeichen und Zahlen.
Gronostaj

40

Sie können auch "DIESE STATEMENT IST FALSCH" schreiben, ohne dass Ihr Computer abstürzt es wird interpretiert.

Bearbeiten: jetzt mit weniger Sarkasmus mehr 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 0to 2^32-1gespeichert 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)zu 2^(n-1)-1- auf diese Weise vermeiden wir die Verwirrung, die mit zwei Arten umgehen zu schreiben +0und -0. Eine 32-Bit-Ganzzahl mit Vorzeichen würde also einen Wert von -2147483648bis enthalten 2147483647. 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 0und liegen 1, 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 genau 0.1als 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, uns 1234100aber auf eine Konvention einigen, um sie 1234.100stattdessen 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ältigend

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

Dies 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.

javascript:alert(0.1+0.2);

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 .


8
Das können Sie in dieser Realität tun . Versuchen Sie dies im Star Trek-Universum. Halte dich einfach zurück, wegen all der Funken und des Rauches.
Michael Petrotta

Genau so funktioniert Festkomma nicht. Es ist tatsächlich ein System, bei dem Zahlen skaliert und vorgespannt werden, um den Dezimalpunkt zu erzeugen. In Ihrem Beispiel ist der Maßstab 1/1000, es gibt jedoch auch Festkommazahlen (insbesondere in Computergrafiken) wie diese: 0 = 0,0, 255 = 1,0 - der Maßstab ist 1/255.
Andon M. Coleman

31

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.


24

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.


15

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.


2
Gute Antwort mit Ausnahme der Details - 16 Bit Adressraum gaben Ihnen 64 KB, nicht 32 MB, und Maschinen wie die 286 hatten 24-Bit-Adressen (für 16 MB). Auch mit 64-Bit-Adressen gehen Sie weit über Terabyte hinaus - eher 16 Exabyte - Terabyte liegen im Bereich der Grenzen, die Motherboards / CPUs der gegenwärtigen Generation setzen - nicht die Größe der Adressen.
Phil

4
32-Bit bezieht sich auf die Maschinenwortgröße und nicht auf die Speicheradressen. Wie Phil erwähnte, war 286 eine 16-Bit-CPU, verwendete jedoch 24 Bit zur Adressierung durch Speichersegmentierung. x86-CPUs sind 32-Bit-CPUs, verwenden jedoch eine 36-Bit-Adressierung. Siehe PAE .
Gronostaj

@gronostaj gut x86 haben 32-Bit-Adressierung von 386 bis Pentium.
Ruslan

Upvote, weil dies die einzige RICHTIGE Antwort hier ist - 32-Bit bezieht sich auf 32-Bit-Speicheradressierung, nicht auf 32-Bit-Arithmetik.
user1207217

@ user1207217: ?? Also nach Ihrer Überlegung zum Beispiel Z80 oder 8080 sind 16-Bit-Prozessoren (wegen 16-Bit-Speicheradressierung und Speicherbus)?
Pabouk

13

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 wird 97, während '1'mit dargestellt wird 49. Ü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 hatbit-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.


2
Ich habe nicht herabgestimmt, aber es gibt eine Reihe von Problemen mit Ihrer Antwort. 1ist 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.
Gronostaj

13

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).


Nicht wahr, der ursprüngliche Pentium-Prozessor verfügte über einen 64-Bit-Datenbus für hohe Speicherbandbreite, obwohl es sich um einen 32-Bit-Prozessor handelte. Der 8088 war ein 16-Bit-Prozessor mit einem 8-Bit-Datenbus.
Doug65536

10

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.


10

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.


8

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.)


6

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).


Das stimmt nicht wirklich; Was sich auf 64 Bit bezieht, ist inkonsistent, aber Systeme mit Registerbreiten von 64 Bit werden häufig als 64 Bit bezeichnet. Laut Wikipedia hat "eine 64-Bit-Computerarchitektur im Allgemeinen 64-Bit-breite Ganzzahl- und Adressregister". Ja, die moderne x86- (oder AMD-64-) Produktlinie verfügt über riesige Spezialregister, aber sie verfügen über 64-Bit-Hauptregister und können auf 48-52-Bit-Speicher zugreifen. die älteren x86-Systeme haben 32-Bit-Hauptregister und greifen auf 24-36-Bit-Speicher zu, und der 8086 wurde als 16-Bit-Chip bezeichnet, hatte 16-Bit-breite Register und griff auf 20-Bit-Speicher zu.
Prosfilaes

@prosfilaes Das ist eine Menge wertvoller Informationen, auf die ich mich bezog (ich konnte mich nicht an die Details erinnern, so wie du es getan hast). Fühlen Sie sich frei, dies in die Antwort zu bearbeiten.
Mafu

6

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:

  • "IPv4 / 6" bezieht sich auf das Internetprotokoll , eine Reihe von Regeln, die definieren, wie Informationen im Internet gepackt und interpretiert werden sollen. Der primäre (oder zumindest bekannteste) Unterschied zwischen IPv4 und IPv6 besteht darin, dass der Adressraum (dh der Adressensatz, mit dem zwischen verschiedenen Standorten im Netzwerk unterschieden werden kann) in IPv6 größer ist. Dies hat damit zu tun, wie viele Bits in jedem Datenpaket, das über das Netzwerk gesendet wird, zur Identifizierung des Absenders und des beabsichtigten Empfängers des Pakets zugewiesen (dh für diesen Zweck reserviert ) werden.
    • Non-Computing-Analogie: Jedes Paket ist wie ein Brief, der per Post verschickt wird, und der Adressraum entspricht der Anzahl der Zeichen, die Sie "verwenden" dürfen, wenn Sie die Adresse und die Absenderadresse auf den Umschlag schreiben.
    • Ich sehe dies noch in keiner der anderen Antworten erwähnt.
  • Die "Wörter" des Computerspeichers (32-Bit und 64-Bit) können im Allgemeinen als die kleinsten Daten angesehen werden, die ein Computer verwendet oder "eindenkt". Diese Datenbits kommen zusammen, um andere Datenbits zu bilden B. Textblöcke oder größere ganze Zahlen.
  • 32-Bit- Zeiger können Wörter sein oder auch nicht, sie werden jedoch atomar behandelt (dh als einzelne Einheiten, die nicht in kleinere Komponenten zerlegt werden können). Zeiger sind die Methode der untersten Ebene, mit der ein Computer den Speicherort eines beliebigen Datenblocks aufzeichnen kann. Beachten Sie, dass die vom Computer (oder sogar vom Betriebssystem) verwendete Zeigergröße den Speicherbereich begrenzt, auf den ein einzelner Zeiger zugreifen kann, da es nur so viele mögliche Speicherstellen gibt, auf die ein Zeiger "zeigen" kann da es mögliche Werte für den Zeiger selbst gibt. Dies entspricht der Art und Weise, in der IPv4 den Bereich möglicher Internetadressen einschränkt, dies jedoch nichtBegrenzen Sie die Datenmenge, die beispielsweise auf einer bestimmten Webseite vorhanden sein kann. Die Zeigergröße beschränkt jedoch nicht die Größe der Daten selbst, auf die der Zeiger zeigen kann. (Ein Beispiel für ein Schema, das zulässt, dass die Datengröße den Zeigerbereich überschreitet, finden Sie in der Inode-Zeiger-Struktur von Linux . Beachten Sie, dass das Wort "Zeiger" etwas anders verwendet wird als normalerweise, da sich der Zeiger normalerweise auf einen Zeiger in bezieht Direktzugriffsspeicher, kein Festplattenspeicher.)
    • Nicht-Computer-Analogie: Hmmmm ... das ist ein bisschen knifflig. Vielleicht ist das Dewey-Dezimalsystem für die Indexierung von Bibliotheksmaterialien ein bisschen ähnlich? Oder wirklich irgendein Indizierungssystem.
    • Siehe SiteNooks Antwort .
    • Bitte beachten Sie, dass meine Erklärung der obigen Hinweise einige subtile Details enthält und möglicherweise nicht ganz korrekt ist. In Programmiersprachen, in denen Programmierer direkt mit Zeigern arbeiten, ist der von mir gezeichnete mentale Modus für praktische Zwecke jedoch in der Regel ausreichend.
  • Die Zahlen, die ein Computer "anzeigen" kann, sind (aus praktischen Gründen) nicht durch die Hardware oder das Betriebssystem des Computers beschränkt. Sie werden wie jeder andere Text behandelt.

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 .


Ich denke, der Verweis auf IPv4 sollte darauf hinweisen, dass die Anzahl der IPv4-Adressen effektiv auf die Länge einer vorzeichenbehafteten 32-Bit-Ganzzahl beschränkt ist, während IPv6 128 Bit verwendet und daher viele Größenordnungen mehr Adressen haben kann.
Clonkex

@Clonkex Möglicherweise, obwohl das definitiv nicht die formulierte Frage ist.
Kyle Strand

5

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^308können theoretisch 308 (+1) Ziffern haben, 9aber 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 ++.


Diese "Antwort" ist falsch: Taschenrechner verwenden die BCD-Zahlendarstellung, um Kürzungsfehler zu vermeiden. IE 0.1 decimal kann nicht genau als Binärzahl mit endlicher Länge dargestellt werden.
Sägemehl

5

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:

#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);

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_tist 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 von mp_limb_tTypen mit Maschinenwortgröße. Wenn eine Zahl zu groß ist, um in ein Maschinenwort zu passen, verwendet GMP mehrere mp_limb_t, um die hohen / niedrigen Teile der Zahl zu speichern.


5

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.

3+3=6

In diesem Fall passt die Nummer immer noch in einen einzelnen "Steckplatz".

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

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.

987+321 is more difficult.

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.

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

Dann bewegen Sie sich zum nächsten Steckplatz und führen die gleiche Addition durch.

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

Da wir einen Überlauf hatten, bedeutet dies, 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 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.

1308

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.


In meinen Gedanken kenne ich 36, aber ich benutze normalerweise nur 16 von ihnen.
Kyle Strand

"Ein Computer verwendet Bits zum Codieren von Zahlen, aber das ist nicht wichtig." Im Zusammenhang mit dem Benutzer ist es sehr wichtig, nach 32-Bit-Wörtern zu fragen und wie sie zum Speichern von Zahlen verwendet werden, die größer als 2 ^ 32-1 sind.
HörmannHH

Es ist nicht wichtig, wie Sie Zahlen im Gedächtnis Ihres Gehirns codieren. Sie haben eine begrenzte Anzahl von Darstellungen; Die meisten haben 10 verschiedene Symbole gelernt. In Ihrem Gehirn wird dies wahrscheinlich in Form von Tausenden von Neuronen und Synapsen dargestellt. In einem Computer wird es in Form von Elektrizität oder ohne Elektrizität auf einer Stromleitung dargestellt. Aus Programmiersicht - oder wenn Sie Mathematik lernen - ist dies überhaupt nicht wichtig, außer in dem seltenen Fall, dass Sie direkt für einen bestimmten Satz von CPUs programmieren. Er fragt nach 32 Bit vs 64 Bit, nicht nach einzelnen Bits.
Frodeborli

3

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.


0

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.


Ich denke, Teile meiner Antwort wiederholen einige der anderen Antworten auf diese Frage. Dies wurde jedoch nicht bemerkt, als ich den Inhalt zum ersten Mal schrieb, da ich das für eine andere Frage schrieb. Auch wenn ich die Antwort von Animism, die Code in der Sprache C enthält, sehr schätze , hatte ich das Gefühl, dass mein Inhalt einige Details zur Funktionsweise von Assembly enthält, die näher an den tatsächlichen Aktionen / dem tatsächlichen Design der CPU liegen. Meine Antwort versucht also nicht, die überlegene Antwort zu sein, die "besser" ist als alle anderen, sondern nur ergänzend. Hinzufügen einer weiteren Perspektive mit einigen zusätzlichen Einsichten
TOOGAM
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.