Beachten Sie, dass der Gleitkomma minder minimale positive Wert ist, wobei die Ganzzahl minder minimale Wert ist. Gleiches gilt für die C-Makros / Konstanten.
dalle
4
in C99 können Sie auch UINT64_MAX und INT64_MAX
Dmitry Vyal
3
@DmitryVyal: Ja, das kannst du, aber das sind die Grenzen von uint64_tund int64_tnicht von int.
Keith Thompson
In C ++ habe ich den gleichen Code wie oben verwendet: #include <limits>und int imax = std::numeric_limits<int>::max();, aber ich erhalte den Fehler Can't resolve struct member 'max'. Irgendwelche Ideen, warum dies auftritt und wie man es behebt? Ich verwende CLion IDE mit CMake und C ++ 11 unter Ubuntu 14.04. Ich denke, es ist mit diesem Problem verbunden
Modulitos
1
Hoffentlich hilft dies jemandem, denn es war ein CLion-IDE-Fehler, den ich mit dem neuesten CLion behoben habe (Build 138.2344 - CLion befindet sich in der Phase des Early Access-Programms und ist daher instabil)
Modulitos
30
Ich weiß, dass es eine alte Frage ist, aber vielleicht kann jemand diese Lösung verwenden:
int size =0;// Fill all bits with zero (0)
size =~size;// Negate all bits, thus all bits are set to one (1)
Bisher haben wir -1 als Ergebnis 'bis Größe ein vorzeichenbehaftetes int ist.
size =(unsignedint)size >>1;// Shift the bits of size one position to the right.
Wie Standard sagt, sind Bits, die verschoben werden, 1, wenn die Variable vorzeichenbehaftet und negativ ist, und 0, wenn die Variable vorzeichenlos oder vorzeichenbehaftet und positiv ist.
Da die Größe vorzeichenbehaftet und negativ ist, würden wir das Vorzeichenbit 1 verschieben, was nicht viel hilft. Daher wandeln wir in vorzeichenloses int um und erzwingen stattdessen eine Verschiebung in 0, wobei das Vorzeichenbit auf 0 gesetzt wird, während alle anderen Bits 1 bleiben.
cout << size << endl;// Prints out size which is now set to maximum positive value.
Wir könnten auch eine Maske und xor verwenden, aber dann mussten wir die genaue Bitgröße der Variablen kennen. Beim Verschieben der Bits müssen wir zu keinem Zeitpunkt wissen, wie viele Bits der int auf dem Computer oder Compiler hat, und wir müssen keine zusätzlichen Bibliotheken einschließen.
Ich würde INT_MAX nicht "eine Lösung für C" nennen. Es ist altmodisch und in C ++ veraltet.
Paul Tomblin
6
Ich denke, beide sind C ++ - Antworten. numeric_limits<int>::max()- funktioniert auch in Vorlagenkontexten, kann aber (aus einem für mich unergründlichen Grund) nicht als Konstante für die Kompilierungszeit verwendet werden. INT_MAX- ist ein Makro, das innerhalb von Vorlagenfunktionen ziemlich nutzlos ist, aber als Konstante für die Kompilierungszeit verwendet werden kann.
OnkelBens
17
Das Lustige ist, dass die Implementierung von numeric_limits <int> :: max auf msvc folgendermaßen aussieht: return (INT_MAX);
Nikola Smiljanić
13
@ Paul Referenz für die Abschreibung bitte. Und raten Sie mal, wie numeric_limits max () implementiert? Das ist richtig, "return INT_MAX", zumindest unter GCC 4.4.0.
2
@UncleBens: Inline-Funktionen können derzeit nicht auf konstante Ausdrücke reduziert werden.
Georg Fritzsche
1
Hier ist ein Makro, mit dem ich den Maximalwert für vorzeichenbehaftete Ganzzahlen erhalte, der unabhängig von der Größe des verwendeten vorzeichenbehafteten Ganzzahltyps ist und für den sich gcc -Woverflow nicht beschwert
#define SIGNED_MAX(x)(~(-1<<(sizeof(x)*8-1)))int a = SIGNED_MAX(a);long b = SIGNED_MAX(b);char c = SIGNED_MAX(c);/* if char is signed for this target */short d = SIGNED_MAX(d);longlong e = SIGNED_MAX(e);
Es gibt keine Garantie dafür, dass int 32 Bit groß ist, und es gibt keine Garantie für das negative Ganzzahlformat im Speicher. Weniger wichtig ist, dass die Leute nicht '~' nachschlagen müssen.
Sqeaky
0
OK, ich habe weder einen Repräsentanten, um die vorherige Antwort (von Philippe De Muyter) zu kommentieren, noch die Punktzahl zu erhöhen. Daher ein neues Beispiel, das seine Definition für SIGNED_MAX verwendet und für vorzeichenlose Typen trivial erweitert wurde:
// We can use it to define limits based on actual compiler built-in types also: #define INT_MAX SIGNED_MAX(int)// based on the above, we can extend it for unsigned types also:#define UNSIGNED_MAX(x)((SIGNED_MAX(x)<<1)|1)// We reuse SIGNED_MAX#define UINT_MAX UNSIGNED_MAX(unsignedint)// on ARM: 4294967295// then we can have:unsignedint width = UINT_MAX;
Im Gegensatz zur Verwendung dieses oder jenes Headers verwenden wir hier den realen Typ aus dem Compiler.
int
mitlong long int
in Gregories Antwort ...-pedantic
) unterstützen es.Antworten:
In C ++:
dann benutze
std::numeric_limits
ist ein Vorlagentyp, der mit anderen Typen instanziiert werden kann:In C:
dann benutze
oder
quelle
min
der minimale positive Wert ist, wobei die Ganzzahlmin
der minimale Wert ist. Gleiches gilt für die C-Makros / Konstanten.uint64_t
undint64_t
nicht vonint
.#include <limits>
undint imax = std::numeric_limits<int>::max();
, aber ich erhalte den FehlerCan't resolve struct member 'max'
. Irgendwelche Ideen, warum dies auftritt und wie man es behebt? Ich verwende CLion IDE mit CMake und C ++ 11 unter Ubuntu 14.04. Ich denke, es ist mit diesem Problem verbundenIch weiß, dass es eine alte Frage ist, aber vielleicht kann jemand diese Lösung verwenden:
Bisher haben wir -1 als Ergebnis 'bis Größe ein vorzeichenbehaftetes int ist.
Wie Standard sagt, sind Bits, die verschoben werden, 1, wenn die Variable vorzeichenbehaftet und negativ ist, und 0, wenn die Variable vorzeichenlos oder vorzeichenbehaftet und positiv ist.
Da die Größe vorzeichenbehaftet und negativ ist, würden wir das Vorzeichenbit 1 verschieben, was nicht viel hilft. Daher wandeln wir in vorzeichenloses int um und erzwingen stattdessen eine Verschiebung in 0, wobei das Vorzeichenbit auf 0 gesetzt wird, während alle anderen Bits 1 bleiben.
Wir könnten auch eine Maske und xor verwenden, aber dann mussten wir die genaue Bitgröße der Variablen kennen. Beim Verschieben der Bits müssen wir zu keinem Zeitpunkt wissen, wie viele Bits der int auf dem Computer oder Compiler hat, und wir müssen keine zusätzlichen Bibliotheken einschließen.
quelle
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
quelle
numeric_limits<int>::max()
- funktioniert auch in Vorlagenkontexten, kann aber (aus einem für mich unergründlichen Grund) nicht als Konstante für die Kompilierungszeit verwendet werden.INT_MAX
- ist ein Makro, das innerhalb von Vorlagenfunktionen ziemlich nutzlos ist, aber als Konstante für die Kompilierungszeit verwendet werden kann.Hier ist ein Makro, mit dem ich den Maximalwert für vorzeichenbehaftete Ganzzahlen erhalte, der unabhängig von der Größe des verwendeten vorzeichenbehafteten Ganzzahltyps ist und für den sich gcc -Woverflow nicht beschwert
quelle
Warum nicht einen Code schreiben wie:
quelle
OK, ich habe weder einen Repräsentanten, um die vorherige Antwort (von Philippe De Muyter) zu kommentieren, noch die Punktzahl zu erhöhen. Daher ein neues Beispiel, das seine Definition für SIGNED_MAX verwendet und für vorzeichenlose Typen trivial erweitert wurde:
Im Gegensatz zur Verwendung dieses oder jenes Headers verwenden wir hier den realen Typ aus dem Compiler.
quelle
Es kann architekturabhängig sein, funktioniert aber zumindest in meinem Setup.
quelle
Für den spezifischen Maximalwert von int schreibe ich normalerweise die hexadezimale Notation:
anstelle des unregelmäßigen Dezimalwerts:
quelle
Wie wäre es mit
(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
ist . Dies ist das gleiche wie2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)
.Wenn
sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max signed int of 4 bytes]
.Sie können nicht verwenden,
2*(1 << (8*sizeof(int)-2)) - 1
da es überläuft, aber(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
funktioniert.quelle