Warum haben alle Datentypen eine Potenz von 2?

7

Warum haben alle Datentypgrößen immer eine Potenz von 2?

Nehmen wir zwei Beispiele:     kurz int 16

%Vor%

Warum folgen sie nicht so?

%Vor%     
Vivek Goel 04.03.2011, 09:21
quelle

9 Antworten

11

Das ist ein Implementierungsdetail, und das ist nicht immer der Fall. Einige exotische Architekturen haben Nicht-Power-of-Two-Datentypen. Zum Beispiel waren 36-Bit-Wörter zu einem bestimmten Zeitpunkt gemeinsam.

Der Grund, warum zwei von heute fast universell sind, besteht darin, dass es typischerweise interne Hardware-Implementierungen vereinfacht. Als ein hypothetisches Beispiel (ich mache keine Hardware, also muss ich gestehen, dass dies hauptsächlich Vermutungen sind), könnte der Teil eines Opcodes, der anzeigt, wie groß eines seiner Argumente ist, als der Zweierpotenz-Index gespeichert werden die Anzahl der Bytes in dem Argument, also zwei Bits, ist ausreichend, um auszudrücken, welches von 8, 16, 32 oder 64 Bits das Argument ist, und die Schaltung, die erforderlich ist, um dies in die entsprechenden Verriegelungssignale umzuwandeln, wäre ziemlich einfach.

    
Marcelo Cantos 04.03.2011, 09:24
quelle
3

Der Grund, warum integrierte Typen diese Größen sind, ist einfach, dass dies CPUs nativ unterstützen, d. h. es ist am schnellsten und am einfachsten. Kein anderer Grund.

Wie für Strukturen, können Sie Variablen darin haben, die (fast) eine beliebige Anzahl von Bits haben, aber Sie werden normalerweise mit ganzzahligen Typen bleiben wollen, es sei denn, es gibt einen wirklich dringenden Grund, etwas anderes zu tun.

Normalerweise wollen Sie auch Typen mit identischer Größe gruppieren und eine Struktur mit den größten Typen (normalerweise Zeigern) starten.
Das vermeidet überflüssiges Auffüllen und stellt sicher, dass Sie keine Zugriffsbeschränkungen für einige haben CPUs weisen fehlausgerichtete Felder auf (einige CPUs können sogar eine Exception bei nicht ausgerichtetem Zugriff auslösen, aber in diesem Fall würde der Compiler Padding hinzufügen, um es zu vermeiden).

    
Damon 04.03.2011 09:23
quelle
3

Die Größe von char, short, int, long usw. hängt von der Plattform ab. 32-Bit-Architekturen neigen dazu, char = 8, kurz = 16, int = 32, lang = 32 zu haben. 64-Bit-Architekturen neigen dazu, char = 8, kurz = 16, int = 32, lang = 64 zu haben.

Viele DSPs verfügen nicht über zwei Arten von Leistung. Zum Beispiel, Motorola DSP56k (ein bisschen veraltet) hat 24 Bit Wörter. Ein Compiler für diese Architektur (von Tasking) hat char = 8, short = 16, int = 24, long = 48. Um die Dinge zu verwirren, haben sie die Ausrichtung von char = 24, kurz = 24, int = 24, lang = 48 gemacht. Dies liegt daran, dass es keine Byte-Adressierung aufweist: Die minimal zugängliche Einheit ist 24 Bit. Dies hat die aufregende (ärgerliche) Eigenschaft, eine Menge divid / modulo 3 einzubeziehen, wenn Sie wirklich auf ein 8-Bit-Byte in einem Array von gepackten Daten zugreifen müssen.

Sie finden nur Nicht-Power-of-2 in speziellen Kernen, deren Größe auf ein spezielles Nutzungsmuster zugeschnitten ist, was sich positiv auf die Leistung und / oder Leistung auswirkt. Im Falle von 56k lag dies daran, dass es eine Multiply-Add-Einheit gab, die zwei 24-Bit-Größen laden und sie zu einem 48-Bit-Ergebnis in einem einzigen Zyklus auf 3 Bussen gleichzeitig hinzufügen konnte. Die gesamte Plattform wurde darauf ausgelegt.

Der Grund, warum die meisten Allzweckarchitekturen powers-of-2 verwenden, ist, dass sie auf dem Oktett (8-Bit-Bytes) als Mindestgrößentyp (abgesehen von Flags) standardisiert sind. Es gibt keinen Grund, dass es nicht 9 Bit hätte sein können, und wie an anderer Stelle erwähnt, waren 24 und 36 Bit üblich. Dies würde den Rest des Designs durchdringen: Wenn x86 9 Bit Bytes wäre, hätten wir 36 Oktett-Cache-Zeilen, 4608 Oktettseiten und 569 KB wären genug für alle :) Wir hätten wahrscheinlich keine "Knabbereien", obwohl Sie können ein 9-Bit-Byte nicht in zwei Hälften teilen.

Das ist jetzt ziemlich unmöglich zu tun. Es ist alles sehr gut, ein solches System von Anfang an zu haben, aber die Zusammenarbeit mit Daten, die von 8-Bit-Bytesystemen erzeugt werden, wäre ein Albtraum. Es ist bereits schwer genug, 8-Bit-Daten in einem 24-Bit-DSP zu analysieren.

    
John Ripley 04.03.2011 09:31
quelle
2

Nun, sie sind Potenzen von 2, weil sie Vielfache von 8 sind, und das kommt (vereinfacht ein wenig) von der Tatsache, dass normalerweise die atomare Zuordnungseinheit im Speicher ein Byte ist ( edit ) : oft, aber nicht immer) wird mit 8 Bits gemacht.

Größere Datengrößen werden mit mehreren Bytes gleichzeitig erstellt. So könnten Sie 8,16,24,32 ... Datengrößen haben.

Aus Gründen der Speicherzugriffsgeschwindigkeit werden nur Potenzen von 2 als Multiplikator der Mindestgröße (8) verwendet, sodass Sie Datengrößen in folgenden Zeilen erhalten:

%Vor%     
garph0 04.03.2011 09:29
quelle
1

8 Bits ist die gebräuchlichste Größe für ein Byte (aber nicht die nur Größe, Beispiele für 9-Bit-Bytes und andere Byte-Größen sind nicht schwer zu finden). Größere Datentypen sind fast immer Vielfache der Byte-Größe, daher sind sie typischerweise 16, 32, 64, 128 Bit auf Systemen mit 8 Bit Bytes, aber nicht immer Zweierpotenzen, z. 24 Bits sind für DSPs üblich, und es gibt 80-Bit- und 96-Bit-Fließkommatypen.

    
Paul R 04.03.2011 09:30
quelle
0

Die Größen von Standard-Integraltypen sind als Vielfaches von 8 Bits definiert, weil ein byte 8-Bits ist (mit einigen extrem seltenen Ausnahmen) und der Datenbus der CPU normalerweise ein Vielfaches von 8 Bits breit ist .

Wenn Sie wirklich 12-Bit-Integer benötigen, könnten Sie bit fields in Strukturen (oder Unionen) wie folgt verwenden:

%Vor%

Dies kann in eingebetteten / Low-Level-Umgebungen nützlich sein - aber bedenken Sie, dass die Gesamtgröße der Struktur immer noch auf die volle Größe komprimiert wird.

    
GrahamS 04.03.2011 09:32
quelle
0

Sie sind nicht unbedingt. Auf einigen Computern und Compilern sizeof(long double) == 12 (96 Bits).

    
fredoverflow 04.03.2011 09:37
quelle
0

Es ist nicht notwendig, dass alle Datentypen eine Potenz von 2 als Anzahl der darzustellenden Bits verwenden. Zum Beispiel verwendet long double 80 Bits (obwohl seine Implementierung abhängig davon, wieviele Bits zuzuteilen sind).

Ein Vorteil, den Sie mit einer Potenz von 2 erzielen, ist, dass größere Datentypen als kleinere dargestellt werden können. Zum Beispiel können 4 Zeichen (jeweils 8 Bits) ein int (32 Bits) bilden. Tatsächlich haben einige Compiler 64-Bit-Nummern mit zwei 32-Bit-Nummern simuliert.

    
Shamim Hafiz 04.03.2011 09:47
quelle
0

In den meisten Fällen versucht Ihr Computer, alle Datenformate entweder in einem ganzen Vielfachen (2, 3, 4 ...) oder einem ganzen Teil (1/2, 1/3, 1/4 ...) zu halten. der Maschinendatengröße. Dies geschieht so, dass jedes Mal, wenn es N Datenwörter lädt, eine ganzzahlige Anzahl von Informationsbits für Sie geladen wird. So müssen später keine Teile neu zusammengesetzt werden.

Sie können dies zum Beispiel im x86 sehen:

Ein Char ist 1/4 von 32 Bits

ein Kurzschluss ist 1/2 von 32 Bits

ein int / long sind ganze 32 Bits

ein langes langes ist 2x 32 Bits

Ein Float ist ein einzelnes 32-Bit

ein Doppel ist zweimal 32-Bit

ein langes double kann entweder drei oder vier mal 32-bit sein, abhängig von den Einstellungen des Compilers. Dies liegt daran, dass es für 32-Bit-Maschinen drei native Maschinenwörter gibt (also keinen Overhead), um 96 Bits zu laden. Auf 64-Bit-Rechnern ist es ein natives Maschinenwort von 1,5, daher wären 128 Bits effizienter (keine Rekombination). Der tatsächliche Dateninhalt eines langen Double auf x86 ist 80 Bit, also sind beide bereits aufgefüllt.

Als letzter Aspekt lädt der Computer nicht immer die ursprüngliche Datengröße. Es ruft zuerst eine Cache-Zeile ab und liest daraus in nativen Maschinenwörtern. Die Cache-Zeile ist größer, normalerweise um 64 oder 128 Bytes. Es ist sehr nützlich, dass ein sinnvolles Datenpaket in diese Datei passt und nicht an der Kante hängen bleibt, da Sie dann zwei ganze Cache-Zeilen laden müssen, um sie zu lesen. Aus diesem Grund sind die meisten Computerstrukturen eine Zweierpotenz; Es passt in jede Speichergröße von zwei Größen, egal ob halb, komplett, doppelt oder mehr - Sie werden garantiert niemals an einer Grenze landen.

    
dascandy 04.03.2011 10:02
quelle

Tags und Links