Min- und Max-Wert des Datentyps in C
Was ist die Funktion zum ermitteln der min und der max mögliche Wert-Datentypen (ich.e, int, char.etc) in C?
InformationsquelleAutor der Frage SuperString | 2010-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie verwenden möchten
Grenzen.h
stellt die folgenden Konstanten (wie in der verlinkten Referenz):Wo
U*_MIN
entfällt für offensichtliche Gründe (alle unsigned-Typ hat einen minimalen Wert von 0).Ähnlich
float.h
bietet die Grenzwerte fürfloat
unddouble
Typen:Sollten Sie den Artikel Lesen auf
floats.h
sorgfältig, obwohlfloat
unddouble
können, halten Sie die vorgeschriebenen minimalen und maximalen Werte, sondern die Präzision, mit der jede Art vertreten können Daten möglicherweise nicht mit dem übereinstimmen, was es ist Sie versuchen, zu speichern. Insbesondere ist es schwierig zu speichern ist eine außergewöhnlich hohe Anzahl mit extrem kleinen Fraktionen angeschlossen. Sofloat.h
bietet eine Reihe weiterer Konstanten, die Ihnen helfen, zu bestimmen, ob einfloat
oder einedouble
können,in der Tat,stellen eine Besondere Zahl.InformationsquelleAutor der Antwort Mark Elliot
"Aber " Glyphe", höre ich Sie Fragen, "was, wenn ich haben zu bestimmen, der den maximalen Wert für ein opaker Typ, dessen maximum sich vielleicht irgendwann ändern?" Sie könnte weiter: "Was ist, wenn es eine Typdefinition in einer Bibliothek, die ich nicht kontrollieren?"
Ich bin froh, dass Sie fragte, denn ich verbrachte ein paar Stunden Kochen, bis eine Lösung (die musste ich dann wegwerfen, weil es Sie nicht lösen meinem eigentlichen problem).
Können Sie mit diesem handlichen
maxof
makro zum ermitteln der Größe eines gültigen integer-Typ.Können Sie es verwenden, etwa so:
Wenn Sie möchten, können Sie werfen '(t)' auf der Vorderseite dieser Makros, so dass Sie geben Sie ein Ergebnis von der Art, dass Sie Fragen, und Sie müssen nicht Gießen zu vermeiden, Warnungen.
InformationsquelleAutor der Antwort Glyph
Maximale Wert jeder vorzeichenlose Integrale Typ:
(~(t)0)
Maximale Wert jeder signierten ganzzahligen Typ: Wenn Sie eine nicht signierte Variante des Typs t,
((t)((~(unsigned t)0)>>1))
geben Sie das Schnellste Ergebnis, die Sie benötigen (siehe Beispiel Linux-kernel source code referenziert unten). Ansonsten sollten Sie wahrscheinlich verwenden(~(1ULL<<(sizeof(t)*CHAR_BIT-1)))
.Mindestens Wert jeder signierten ganzzahligen Typ: Sie müssen wissen, die Zahl unterzeichnet die Vertretung Ihrer Maschine. Die meisten Maschinen verwenden 2 ergänzen, und so
-(~(1ULL<<(sizeof(t)*CHAR_BIT-1)))-1
wird für Sie arbeiten.Erkennen, ob Ihre Maschine verwendet, um 2 zu ergänzen, zu erkennen, ob
(~(t)0U)
und(t)(-1)
stellen die gleiche Sache. So, kombiniert mit den oben:geben Sie den minimalen Wert keine signierten ganzzahligen Typ. (Tatsächlich gibt es andere Darstellungen, wenn Sie wissen, 2er-Komplement-Darstellung. Zum Beispiel
(t)(1ULL<<(sizeof(t)*CHAR_BIT-1))
sollte äquivalent zu(t)(-(~(1ULL<<(sizeof(t)*CHAR_BIT-1)))-1)
.)Beispiel: (~(size_t)0) liefert den maximalen Wert von size_t. (Und ratet mal, was das ist, wie SIZE_MAX ist #definiert in Linux kernel source code.)
Einer VORBEHALT aber: alle diese Ausdrücke, die die Verwendung von type-casting und so nicht die Arbeit in Präprozessor-Bedingungen (#if ... #elif ... #endif und wie).
InformationsquelleAutor der Antwort Explorer09
Blick auf die folgenden Seiten auf Grenzen.h und float.hdie als Teil der standard-c-Bibliothek.
InformationsquelleAutor der Antwort Nixuz
Schrieb ich einige Makros, die Rückgabe der min-und max-von jeder Art, unabhängig davon, Fehler:
Beispiel-code:
InformationsquelleAutor der Antwort craig65535
Die header-Datei
Grenzen.h
definiert Makros zu erweitern, um die verschiedenen Grenzen und Parameter des standard-integer-Typen.InformationsquelleAutor der Antwort Prasoon Saurav
InformationsquelleAutor der Antwort rahul gupta
MIN-und MAX-Werte von Datentyp integer berechnet werden kann, ohne Verwendung von Bibliotheks-Funktionen als unten ein und dieselbe Logik angewendet werden können, um anderen integer-Typen short, int und long.
InformationsquelleAutor der Antwort Arjun
Um den Maximalwert einer vorzeichenlosen integer-Typ
t
deren Breite zumindest eines derunsigned int
(ansonsten bekommt man Probleme mit integer-promotions):~(t) 0
. Wenn man will, zu unterstützen auch kürzere Typen, man kann hinzufügen, ein weiterer cast:(t) ~(t) 0
.Wenn der integer-Typ
t
unterzeichnet wird, vorausgesetzt, dass es keine Polsterung-bits, verwendet werden kann.Der Vorteil dieser Formel ist, dass Sie nicht auf einige unsignierte version von
t
(oder eine größere Art), die möglicherweise unbekannt oder nicht verfügbar (auchuintmax_t
möglicherweise nicht ausreichend sein, mit nicht-standard-Erweiterungen). Beispiel mit 6 bits (nicht möglich in der Praxis, nur zur besseren Lesbarkeit):In zwei der Ergänzung, der minimale Wert ist das Gegenteil von dem maximalen Wert minus 1 (bei den anderen integer-Darstellungen erlaubt, durch den ISO-C-standard, das ist genau das Gegenteil von dem maximalen Wert).
Hinweis: um Zu erkennen, Fehler in, um sich zu entscheiden welche version zu verwenden:
(t) -1 < 0
funktioniert mit jedem integer-Darstellung, die 1 (true) vorzeichenbehafteter integer-Typen und 0 (false) für unsigned integer-Typen. So kann man verwenden:InformationsquelleAutor der Antwort vinc17