Ist `lange` garantiert mindestens 32 bit?

Durch meine Lektüre der C++ - Standard, habe ich immer so verstanden, dass die Größen der integralen fundamentalen Datentypen in C++ wurden Sie wie folgt vor:

sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)

Ich folgerte dies aus 3.9.1/2:

  1. Es gibt vier Ganzzahl-Typen: "signed char", "short int",
    "int" und "long int"." In dieser Liste
    jeder Typ bietet mindestens genauso viel
    die Lagerung als solche vor es in der
    Liste. Plain ints haben die Natürliche Größe
    angeregt durch die Architektur der
    execution environment

Weiter, die Größe der char ist beschrieben durch 3.9.1/als:

  1. [...] groß genug, um jedes Mitglied der Implementierung der basic-Zeichensatz.

1.7/1 legt dies in konkreter:

  1. Die grundlegende Speichereinheit in der C + + - Speicher-Modell ist das byte. Ein byte ist zumindest groß genug ist, um jedem Mitglied der basic execution character set und besteht aus einer zusammenhängenden Folge von bits, deren Anzahl wird durch die Implementierung festgelegt.

Dies führt mich zu der folgenden Schlussfolgerung:

1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)

wo sizeof sagt uns, wie viele bytes der Typ ist. Darüber hinaus wird durch die Implementierung definiert, wie viele bits sind ein byte. Die meisten von uns sind wahrscheinlich verwendet, um den Umgang mit 8-bit-bytes, aber der Standard sagt, es gibt n bits in einem byte.


In dieser Beitrag, Alf P. Steinbach sagt:

lange gewährleistet ist (mindestens) 32-bit.

Dieser Schlag ins Gesicht von allem, was ich verstehen, die Größe der fundamentalen Datentypen in C++ entsprechend dem Standard. Normalerweise würde ich nur Rabatt, diese Aussage als ein Anfänger, falsch ist, aber da war Alf ich beschlossen, es war es Wert, Sie genauer zu untersuchen.

Also, was sagen Sie? Ist eine lange garantiert der standard, der mindestens 32 bit? Wenn ja, bitte genau, wie diese Garantie ist aus. Ich weiß nur nicht sehen, es.

  1. Der C++ Standard sagt ausdrücklich, dass, um zu wissen, C++ müssen Sie wissen, C (1.2/1) 1

  2. Den C++ - Standard implizit definiert die minimale Grenze auf die Werte, die eine long unterbringen kann sein LONG_MIN-LONG_MAX 2

So, egal, wie groß long ist, muss es groß genug sein, zu halten LONG_MIN zu LONG_MAX.

Aber Alf und die anderen sind bestimmten, dass eine lange muss mindestens 32 bits. Dies ist, was ich bin versucht zu etablieren. Der C++ - Standard wird ausdrücklich darauf hingewiesen, dass die Anzahl der bits in einem byte nicht spezifiziert (es könnte sein, 4, 8, 16, 42) Also, wie ist der Anschluss in der Lage, um Platz für die Nummern LONG_MIN-LONG_MAX zu mindestens 32 bit?


(1) 1.2/1: im folgenden referenzierten Dokumente sind unerlässlich für die Anwendung dieses Dokuments. Für datierte Verweise, nur die Ausgabe zitiert, gilt. Für undatierte Verweise ist die Letzte Ausgabe der in Bezug genommenen Dokuments (einschließlich aller änderungen) gilt.

  • ISO/IEC 2382 (alle Teile), Information technology – Vocabulary
  • ISO/IEC 9899:1999, Programmiersprachen – C
  • ISO/IEC 10646-1:2000, Information technology – Universal Multiple-Octet Coded Character Set (UCS) – Part 1: Architecture and Basic Multilingual Plane

(2), Definiert in <climits> als:

LONG_MIN -2147483647 //-(2^31 - 1)
LONG_MAX +2147483647 //  2^31 - 1
  • Ich habe noch nie gehört, der ein byte nicht 8 bit lang.
  • Es gibt definitiv Maschinen, die can-Adresse und arbeiten nur mit Mengen, die größer als 8 bits, z.B. 32 bit-Worten, dort ist es üblich, char == int == long == 32 bit.
  • Storer: Bytes, die nicht 8 bits sind selten heutzutage, aber es verwendet werden, um eine größere Vielfalt von Systemen auf. Ein Rechner mit 36-bit-Worte hätte ein 9-bit-byte. Der alte CDC Cyber-Anlagen mit 60-bit-Worte ein 60-bit-byte (das würde die Probleme verursachen), wenn Sie jemals bekam einen C-compiler, aber in der Regel Zeichen nahm 6 bits (es war ein 6/12-bit-Schema, wenn Sie wirklich wollten, Kleinbuchstaben).
  • Storer: Texas Instruments hat eine Reihe von DSPs in C++ - Compiler-und 16-bit-byte. Oder Sie benutzt zu haben, ein paar Jahre zurück. Es gibt auch eine anachronistische Tier mit 9-bit-byte, mit Abstammung geht zurück zum Mittelalter. "Unisys"? Sicher nicht. Ich könnte es, wenn Sie wirklich interessiert sind. Cheers,
  • für diejenigen, die Lesen die commentry in diesem post, bitte beachten Sie, dass trotz der sarkastischen tone, der troll bei zuerst habe ich einfach wies ihm zum C-standard, ich denke, das war eine ziemlich prägnante und rein technische Antwort. Ich war nicht in der Lage, ihn zu erfüllen, jedoch.
  • Nun, ich denke, wenn jemand erfindet irgendeine Weise zu speichern (2^32)-1 unterschiedliche Werte in weniger als 32 bits, dann könnte es nicht sein, 32 bit lange. Aber auf alle binary-Plattform, so lange, wie die Mathematik auch gültig ist, müssen Sie 32-bit.
  • Ja, das würde es tun
  • Prägnante, auf jeden Fall. Richtig, ja, wie schon gezeigt, in diesem post. Ich würde vorschlagen, jedoch, dass Sie verlassen eine Menge Schritte, und waren eher kurz angebunden, in der "so in der C std" Antworten. Ich wollte nicht sehen, die Verbindung, so kann ich verstehen, seine Verwirrung.
  • Ja: Siehe stackoverflow.com/questions/271076/... sizeof(long) * CHAR_BITS >= 32
  • vielen Dank für Ihre Gründliche Behandlung dieses Themas. Ich bin auch davon überzeugt, jetzt, und ich hatte das gleiche Verständnis für Sie haben, um mit zu beginnen. Die wichtigste Sprache in der standard - (nicht-Fußnoten, etc.) zu verlassen scheint genug Variablen im Spiel, dass ich dachte, die sicherer spielen war anzunehmen keine bestimmte Größen überhaupt, im Allgemeinen. Ich war auch überrascht zu sehen, so etwas wie LONG_MAX mit einem Wert, der von der Norm vorgegebenen-ich dachte, der Sinn eines solchen Makros zu ermöglichen, die Umsetzung definition.
  • Ich könnte einfach jemand zum X-standard-Antwort auf alle C++ - Frage. Es ist nicht eine Antwort. Es ist nicht unvernünftig Liste ein Abschnitt/Absatz, etc., wenn Sie unter Berufung auf die standard. Sie brachte die ersten sarkastischen Kommentaren an der Diskussion. Sie sollten versuchen, verdienen einen gewissen Respekt für als ein anständiger Mensch neben einem C++ - Gott.
  • wieder dein Punkt 4, "In C++ integral-Arten gespeichert sind, in 2 s Kompliment in der zugrunde liegenden Repräsentation" Nein, sind Sie garantiert binäre Darstellung, kann jedoch nicht garantiert werden 2-Komplement bilden. C-und C++ - support, 2-Komplement, 1er-Komplement und Größenordnung-&-Zeichen. Ich bin glücklich für die Einsicht, und SO rep alle daraus gewonnen. 🙂 Unglücklich zu sehen, der troll folgt hier. 🙁
  • auch, sorry, wieder Ihre Zusammenfassung der Punkte 2 und 3, des definierten Bereichs ist, einen definierten minimalen Bereich. das ist der standard nicht erforderlich ist, die besonderen Werte, die es ermöglicht, jeden Bereich, ist, dass "größer".
  • Hast du nicht gelesen #6?
  • Nein, ich lese es. Fazit ist OK. Cheers,
  • Ihre Antwort sollte be zog in eine Antwort, die nicht bearbeitet an den Anfang Ihrer Frage. (Also, warum es heißt eine 'Frage').
  • Und sollte die Antwort markiert werden CW?
  • Diblings Himmel Nein, Sie verdienen den Ruf, wenn Sie die richtige Antwort. Allerdings, wenn Sie gerade kompilieren, was eine andere person hat teilweise (oder ganz) gesagt, dann sollte man Ihnen die 'akzeptiert' Häkchen und Bearbeiten Sie Ihre Antwort mit jeder zusätzlicher Kommentar.
  • Problem mit der derzeit akzeptierte Antwort ist, dass die komplette Antwort war nur angekommen, die durch ein langes Gespräch mit vielen Teilnehmern. Meine Antwort ist einfach: eine Destillation von alles gesagt, von allen. Es ist mehr consise und vollständiger als MSN die eigentliche Antwort, und direkt die Anliegen von Menschen, die, wie ich, daran gezweifelt, dass C++ geerbt, die Dinge aus der C-standard. Wie auch immer, ich lass es so wie es ist jetzt.
  • In anderen Worten, es ist nicht meine Antwort-ich habe nur geschrieben es.
  • Diese Website wäre 300% besser, wenn niemand Bearbeiten kann, anderen Menschen die Inhalte, die obsessive compulsive Redakteure haben fast nie die Anerkennung für die Feinheiten des Verständnisses, geändert werden, indem Sie Ihre Bearbeitungen.
  • In C, ist es nicht notwendigerweise der Fall, dass sizeof (int) <= sizeof (long int); int könnte eine zusätzliche Polsterung bits, könnte es größer machen, als long int. Ich bin mir nicht sicher, ob dies gilt für C++. In jedem Fall, keine vernünftige Umsetzung würde dies zu tun.

InformationsquelleAutor John Dibling | 2010-12-01
Schreibe einen Kommentar