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:
- 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:
- [...] groß genug, um jedes Mitglied der Implementierung der basic-Zeichensatz.
1.7/1 legt dies in konkreter:
- 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.
-
Der C++ Standard sagt ausdrücklich, dass, um zu wissen, C++ müssen Sie wissen, C (1.2/1) 1
-
Den C++ - Standard implizit definiert die minimale Grenze auf die Werte, die eine
long
unterbringen kann seinLONG_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, alslong int
. Ich bin mir nicht sicher, ob dies gilt für C++. In jedem Fall, keine vernünftige Umsetzung würde dies zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
C++ verwendet, die Grenzen der Definition in der C-standard (C++: 18.3.2 (c.Grenzen), C: 5.2.4.2.1):
So dass Sie garantiert, dass ein long mindestens 32 bit.
Und wenn Sie wollen, Folgen Sie der langen Umwegen, ob
LONG_MIN
/LONG_MAX
darstellbar sind durch einelong
, Sie haben sich 18.3.1.2 (numerisch.Grenzen.Mitglieder) in der C++ - standard:Zog ich die Fußnoten in den Kommentar, so ist es nicht genau das, was erscheint in der standard. Aber im Grunde bedeutet, dass
std::numeric_limits<long>::min()==LONG_MIN==(long)LONG_MIN
undstd::numeric_limits<long>::max()==LONG_MAX==(long)LONG_MAX
.Also, auch wenn der C++ - standard nicht spezifiziert, die bitweise Darstellung (signed) negative zahlen, es muss entweder zu zweit-ergänzen und erfordern 32-bit Speicher insgesamt, oder es hat einen expliziten Vorzeichen-bit was bedeutet, dass es 32-bit-Speicher auch.
long
muss Platz für die Werte [LONG_MIN, LONG_MAX]? Ich kann nicht finden, eine solche Referenz.LONG_MIN
als "minimum-Wert für ein Objekt vom Typlong int
" (und ähnlich für LONG_MAX).sizes of integer types
Abschnitt ist vom C-standard. Auch in der C++ - standard gibt es verweist zurück auf das ISO-C-standard demonostrated "SIEHE AUCH: ISO-C Unterklasse xxx"<climits>
mit dem gleichen Inhalt wie<limits.h>
(S 18.2.2) zeigt mir, dass der Typ breiten erklärt, in der C-standard auch für C++.(long)LONG_MAX==LONG_MAX
und(long)LONG_MIN==LONG_MIN
.Die Antwort ist definitiv JA. Lesen Sie meine OP und all die Kommentare zu verstehen, warum genau, aber hier ist die kurze version. Wenn Sie Zweifel oder Frage irgendwelche von diesem, ich möchte Sie ermutigen, Lesen Sie den gesamten thread und alle Kommentare. Ansonsten akzeptieren dies als wahr:
LONG_MIN
undLONG_MAX
LONG_MIN
ist definiert als nicht mehr als-2147483647
LONG_MAX
ist definiert als nicht weniger als+2147483647
-2147483647
und+2147483647
im Binär -, müssen Sie 32-bit.LONG_MIN
durchLONG_MAX
Daher eine
long
muss mindestens 32 bits1.EDIT:
LONG_MIN
undLONG_MAX
Werte bei Größen, diktiert durch die C-standard (ISO/IEC 9899:TC3) der in §5.2.4.2.1:1 32 bits: Dies bedeutet nicht, dass
sizeof (long) >= 4
, da ein byte nicht unbedingt 8 bit. Nach dem Standard, ein byte ist etwas unspezifisch (Plattform-Standard) Anzahl der bits. Während die meisten Leser finden das merkwürdig, es ist echte hardware, auf derCHAR_BIT
ist 16 oder 32.C standard minimum value of LONG_MAX
wenn Sie mir nicht glauben.long
mindestens 32 bits ist nicht bedeutet, dasssizeof(long) >= 4
. Es sind echte Maschinen für dieCHAR_BIT
ist 16 oder 32, und dahersizeof(long)
werden kann, ist so klein wie 2 oder 1. Im Gegensatz zum Einerkomplement-mainframes und die 9-bit-minis, diese sind noch in der Produktion, soweit ich weiß. (Meistens sind Sie ungewöhnlich mikrocontroller. Ja, mit Ihnen zu arbeiten, ist irgendwie ein Schmerz.)long long
bevor Sie sich Gedanken darüber, ob die oberen bits des Ergebnis sollte bestenfalls eine Zahl oder NaN.Den C++ - standard fest, dass der Inhalt
<climits>
sind die gleichen wie die C-header -<limits.h>
(18.2.2 in ISO C++03 doc).Leider, ich habe nicht eine Kopie der C-Norm existiert, pre-C++98 (d.h. C90), aber in C99 (Abschnitt 5.2.4.2.1),
<limits.h>
muss zumindest diese minimalen Werte. Ich glaube nicht, dass dies geändert C90, andere als C99 hinzufügen derlong long
Arten.Müssen Sie die 32-bit-im-Wert-Darstellung um zumindest, dass viele bitpatterns. Und da C++ erfordert eine binäre Darstellung von Ganzzahlen (explizite Sprache, um diesen Effekt in standard -, §3.9.1/7), Q. E. D.
Ja, der C++ - standard wird ausdrücklich darauf hingewiesen, dass die Anzahl der bits in einem byte angegeben. Die Anzahl der bits in einem lange nicht angegeben wird, entweder.
Einstellung ein untere Schranke auf eine Zahl ist nicht Angabe es.
Der C++ standard sagt an einer Stelle:
Heißt es, im Effekt, in einem anderen Ort, über die Aufnahme der C-standard:
(abgesehen davon, dass AFAIK die Bezeichner SHORT_BITS, INT_BITS und LONG_BITS nicht existieren, und dass diese Grenzen sind abgeleitet von den Anforderungen für den minimalen Wert für die Arten.)
Dies folgt aus der Tatsache, dass eine bestimmte Anzahl von bits erforderlich sind, mathematisch zu Kodieren, alle Werte in der (z.B. für Long -) LONG_MIN..LONG_MAX Bereich.
Schließlich, shorts, ints und longs müssen alle aus einer festen Anzahl von Zeichen; sizeof() immer Berichte ein fester Wert. Auch das Durchlaufen von Speicher char by char, muss der Zugriff auf jedes bit, das stellt einige praktische Beschränkungen.
Diese Anforderungen sind nicht im Widerspruch in irgendeiner Weise. Alle Größen, die den Anforderungen OK sind.
Gab es Maschinen, die vor langer Zeit mit einer nativen word-Größe von 36 bit. Wenn Sie den port ein C++ - compiler, können Sie rechtlich entscheiden, mit 9 bits in einem char, 18 in beiden kurz-und int, und 36 in lang. Man könnte auch rechtlich zu entscheiden haben, 36 bits in jeder dieser Arten, aus dem gleichen Grund, die Sie kann haben 32 bit, ein int auf einem typischen 32-bit-system heute. Es gibt Reale Implementierungen, die Verwendung von 64-bit chars.
Siehe auch Abschnitte 26.1-6 und 29,5 von der C++ FAQ Lite.
sizeof(char)
, weil so weit wie C++ betrifft, istchar
s bytes, aber bytes sind nicht unbedingt Oktette). Denn das ist, wie der Standard sagt Sie.