Garantierte Mindestgrößen für Typen in C?
Können Sie in der Regel keine Annahmen über die Mindestgröße für ein Datentyp?
Was ich bisher gelesen habe:
- char: 1 Byte
- short: 2 Byte
- int: 2 Byte, in der Regel 4 Byte
- long: 4 Byte
schwimmen??? doppelt???
Sind die Werte in float.h
und limits.h
system abhängig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist in der Wikipedia-Artikel:
char
ist definiert als mindestens 8 bits (<limits.h> CHAR_BIT
ist erforderlich, um mindestens 8).CHAR_BIT
8 sein, also das bedeutet, dassCHAR_BIT
im wesentlichen 8 auf gewöhnlichen desktop - /workstation - /server-Umgebungen. Die einzigen Ausnahmen sind die alten legacy-mainframes, DSPs, und möglicherweise einige embedded-Systeme.Ja, die Werte in
float.h
undlimits.h
sind system abhängig. Sie sollten nie Annahmen über die Breite eines geben, aber der standard keine Festlegung einiger Mindeststandards. Siehe §6.2.5 und §5.2.4.2.1 in der C99-standard.Zum Beispiel, der standard sagt nur, dass ein
char
sollte groß genug ist, um jedes Zeichen in der Ausführung Zeichensatz. Es sagt nicht, wie weit es ist.Für die floating-point-Fall, die standard-Hinweise auf die Reihenfolge, in der die breiten der Typen sind gegeben:
§6.2.5.10
Sie implizit definiert ist, die breiter als die anderen, aber nicht speziell, wie weit Sie sind. "Teilmenge" selbst ist vage, weil eine
long double
können die exakt gleichen Bereich vondouble
und erfüllen diese Klausel.Dies ist ziemlich typisch, wie C geht, und eine Menge Links auf jeder einzelnen Umgebung. Sie können nicht annehmen, Sie haben zu Fragen der compiler.
Jedoch, die neuen C99 gibt (in
stdint.h
) optional Arten von minimalen Größen, wieuint_least8_t
,int_least32_t
, und so weiter..(siehe en_wikipedia_Stdint_h)
Neun Jahre und immer noch keine direkte Antwort, über die mindestens Größe für
float, double, long double
.Für floating point geben ...
Vom praktische point-of-view -,
float
Mindestgröße 32-bit unddouble
ist 64 - bit. C erlaubtdouble
undlong double
teilen ähnliche Merkmale, so dass einelong double
könnte so klein wie einedouble
. Beispiel1.Könnte ich mir vorstellen, eine C-konforme 48-bit -
double
Bestand haben kann – noch nicht bekannt.Nun, stellen wir uns unsere reiche Onkel stirbt und hat uns ein Vermögen zu zahlen für die Entwicklung und kulturelle Förderung für http://www.smallest_C_float.com.
C gibt:
1)
float
endlichen Bereich ist mindestens [1E-37... 1E+37]. SehenFLT_MIN, FLT_MAX
2)
(1.0f + FLT_EPSILON) – 1.0f <= 1E-5
.3)
float
unterstützt positive und negative Werte.Unserer
float
könnte minimal vertreten alle Kombinationen, mit Basis 10, derSX.YYYYY*10^E
.0.0
und±1E+37
sind auch erforderlich, (3 mehr). Wir brauchen nicht -0.0, sub-normalen, ±infinity noch nicht-ein-zahlen.Ist 2*9*10^5*74 + 3 Kombinationen oder 133,200,003 die braucht mindestens 27 bits zu Kodieren - irgendwie. Recall das Ziel ist die minimale Größe.
Mit einer klassischen Basis 2 Ansatz können wir davon ausgehen, dass ein stillschweigender 1 und erhalten
S1.bbbb_bbbb_bbbb_bbbb_b*2^e oder 2*2^17*226 Kombinationen oder 26 bit.
Wenn wir versuchen, base 16, dann brauchen wir über 2*15*16^(4 oder 5)*57-Kombinationen oder mindestens 26 bis 30 bits.
Fazit: Ein C
float
muss mindestens 26 bits der Codierung.C s
double
müssen, ausdrücklich nicht zu einem größeren exponentiellen Bereich alsfloat
, es hat nur eine andere minimale Präzision Voraussetzung.1E-9
.S1.bbbb_bbbb_bbbb_bbbb_ bbbb_ bbbb_ bbbb_bb*2^e --> 2*2^30*226 Kombinationen oder 39 bits.
Auf unserer vorstellen-wenn-Sie-wird computer, konnten wir eine 13-bit -
char
und so codierenfloat, double, long double
ohne Polsterung. So können wir erkennen einen nicht gepolsterten 26-bit -float
- und 39-bit -double, long double
.1: Microsoft Visual C++ x86, wodurch ein long double ist ein synonym für double
Oft Entwickler Fragen diese Art von Fragen sind der Umgang mit dem arrangieren einer gepackten
struct
mit einer definierten Speicher-layout (wie bei einer message-Protokoll). Die Annahme ist, dass die Sprache sollte direkt angeben, Aufbahrung, 16-, 24-, 32-bit, usw. Felder für den Zweck.Dass routine und akzeptabel für die Montage von Sprachen und anderen anwendungsspezifischen Sprachen, die eng mit einer bestimmten CPU-Architektur, aber ist manchmal ein problem in eine Allgemeine Sprache, die möglicherweise anvisiert werden, wer-weiß-was Art von Architektur.
In der Tat, die Sprache C war bestimmt nicht für eine bestimmte hardware-Implementierung. Es wurde angegeben, in der Regel also einen C-compiler Implementierer könnte richtig anpassen an die Gegebenheiten auf einer bestimmten CPU. Ein Frankenstein der hardware-Architektur, bestehend aus 9-bit-bytes, 54-bit-Wörtern, und eine 72-bit memory-Adressen ist einfach und eindeutig—zugeordnet, um C-Funktionen. (
char
ist mit 9 bits;short int
,int
, undlong int
54 bits.)Diese Allgemeinheit ist der Grund, warum die C-Spezifikation sagt etwas zum Effekt von "don' T erwarten, dass viel über die Größe von ints jenseits sizeof (char) <= sizeof (short int) <= sizeof (int) <= sizeof (long int)." Das impliziert, dass chars, könnte die gleiche Größe wie der longs!
Die aktuelle Realität ist—und die Zukunft scheint zu halten—das software-Anforderungen, Architekturen bieten 8-bit-bytes und Speicher-Worte adressierbar als einzelne bytes. Das war nicht immer so. Vor nicht allzu langer Zeit arbeitete ich auf einer CDC Cyber Architektur, die features, die 6-bit - "bytes" und 60 bit-Worte. Einer C-Implementierung auf, das wäre interessant. In der Tat, dass die Architektur ist verantwortlich für die seltsame Verpackung Semantik von Pascal—wenn jemand erinnert sich daran.
Wenn Sie wan ' T, um check die Größe (in vielfachen von chars) jeder Art auf Ihrem system/Plattform ist wirklich die Größe, die Sie erwarten, könnten Sie das tun:
static_assert ( sizeof(float)*CHAR_BIT == 32 , "(float) size != 32")
;C99 N1256 standard-Entwurf
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
C99 gibt zwei Arten von integer-Garantien:
Relative garantiert
6.2.5 Arten:
und 6.3.1.1 Boolean, Zeichen und ganze zahlen bestimmt die relative Konvertierung Reihen:
Absolute minimum Größen
Erwähnt https://stackoverflow.com/a/1738587/895245 , hier ist das Zitat für die Bequemlichkeit.
5.2.4.2.1 Größen von integer-Typen
<limits.h>
:Floating point
Wenn die
__STDC_IEC_559__
makro definiert ist, dann wird die IEEE-Typen sind garantiert für jeden C-Typ, obwohllong double
hat ein paar Möglichkeiten: Ist es sicher davon ausgehen, dass floating-point vertreten ist, mit IEEE754 schwebt in C?float
unddouble
vslong double
? Ich denke, es ist gut genug erklärt auf den link.float
unddouble
,Unter Angabe der standard nicht geben, was definiert ist als "die richtige Antwort", aber es nicht wirklich reflektieren, die Art und Weise Programme sind in der Regel geschrieben.
Menschen machen Annahmen, die die ganze Zeit, dass char 8 bit, short 16, int 32, long ist entweder 32 oder 64, und long long ist 64.
Diese Annahmen sind nicht, eine tolle Idee, aber Sie wird nicht gefeuert für Sie.
In der Theorie
<stdint.h>
können verwendet werden, um anzugeben, behoben-bit-Breite Typen, aber Sie haben zu schnorren für Microsoft. (Sehen Sie hier eine MS stdint.h.) Eines der Probleme hier ist, dass C++ technisch muss nur C89-Kompatibilität, um eine konforme Implementierung; auch für plain C, C99 ist nicht vollständig unterstützte auch im Jahr 2009.Es ist auch nicht genau zu sagen, es gibt keine Breitenangabe für
char
. Es ist der standard nur vermeidet zu sagen, ob es signiert ist oder nicht. Hier ist, was C99 tatsächlich sagt:CHAR_BIT 8
SCHAR_MIN -127
//-(27 - 1)SCHAR_MAX +127
//27 - 1UCHAR_MAX 255
//28 - 19
oder16
,18
, ...int
ist 16-bit - als erlaubt durch den C-spec. 100 Millionen pro Jahr bis 2016.Meisten Bibliotheken zu definieren, so etwas wie dieses:
können Sie dann verwenden Sie die Typdefinition in Ihren Programmen anstelle von den standard-Typen.