Notez que la virgule flottante minest la valeur positive minimale , alors que l'entier minest la valeur minimale. Il en va de même pour les macros / constantes C.
dalle
4
dans C99, vous pouvez également utiliser UINT64_MAX et INT64_MAX
Dmitry Vyal
3
@DmitryVyal: Oui, vous pouvez, mais ce sont les limites de uint64_tet int64_t, pas de int.
Keith Thompson
En C ++, j'ai utilisé le même code ci-dessus: #include <limits>et int imax = std::numeric_limits<int>::max();, mais j'obtiens l'erreur Can't resolve struct member 'max'. Des idées sur pourquoi cela se produit et comment y remédier? J'utilise CLion IDE, avec CMake et C ++ 11 sur Ubuntu 14.04. Je pense que c'est lié à ce problème
modulitos
1
J'espère que cela aide quelqu'un, car c'était un bogue de l'IDE CLion que j'ai corrigé en utilisant le dernier CLion (build 138.2344 - CLion est dans la phase du programme d'accès anticipé, et donc instable)
modulitos
30
Je sais que c'est une vieille question mais peut-être que quelqu'un peut utiliser cette solution:
int size =0;// Fill all bits with zero (0)
size =~size;// Negate all bits, thus all bits are set to one (1)
Jusqu'à présent, nous avons -1 comme résultat 'jusqu'à ce que la taille soit un entier signé.
size =(unsignedint)size >>1;// Shift the bits of size one position to the right.
Comme le dit Standard, les bits décalés sont 1 si la variable est signée et négative et 0 si la variable serait non signée ou signée et positive.
Comme la taille est signée et négative, nous décalerions le bit de signe qui est 1, ce qui n'aide pas beaucoup, nous avons donc converti en unsigned int, forçant à passer à 0 à la place, définissant le bit de signe à 0 tout en laissant tous les autres bits rester à 1.
cout << size << endl;// Prints out size which is now set to maximum positive value.
Nous pourrions également utiliser un masque et un xor, mais nous devions ensuite connaître la taille exacte en bits de la variable. Avec le décalage des bits avant, nous n'avons pas besoin de savoir à tout moment combien de bits l'int a sur la machine ou le compilateur ni d'inclure des bibliothèques supplémentaires.
Je n'appellerais pas INT_MAX "une solution pour C". C'est de la vieille école et obsolète en C ++, cependant.
Paul Tomblin
6
Je pense que les deux sont des réponses C ++. numeric_limits<int>::max()- fonctionne également dans des contextes de modèle, mais (pour une raison insondable à mes yeux) ne peut pas être utilisé comme constante de compilation. INT_MAX- est une macro, assez inutile dans les fonctions de modèle, mais peut être utilisée comme constante de compilation.
UncleBens
17
La chose amusante est que l'implémentation numeric_limits <int> :: max sur msvc ressemble à ceci: return (INT_MAX);
Nikola Smiljanić
13
@paul Référence pour la dépréciation s'il vous plaît. Et devinez comment numeric_limits implémente max ()? C'est vrai, "return INT_MAX", au moins sur GCC 4.4.0.
2
@UncleBens: les fonctions inline ne peuvent actuellement pas être réduites à des expressions constantes.
Georg Fritzsche
1
Voici une macro que j'utilise pour obtenir la valeur maximale des entiers signés, qui est indépendante de la taille du type d'entier signé utilisé, et pour laquelle gcc -Woverflow ne se plaindra pas
#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);
Il n'y a aucune garantie que int a une taille de 32 bits et il n'y a aucune garantie sur le format entier négatif en mémoire. Moins important encore, il n'est pas nécessaire de forcer les gens à rechercher «~».
Sqeaky
0
OK Je n'ai ni représentant pour commenter la réponse précédente (de Philippe De Muyter) ni augmenter son score, d'où un nouvel exemple utilisant son define pour SIGNED_MAX trivialement étendu pour les types non signés:
// 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;
Contrairement à l'utilisation de tel ou tel en-tête, nous utilisons ici le type réel du compilateur.
int
par lalong long int
réponse de Gregories ...-pedantic
) le supportent.Réponses:
En C ++:
puis utilisez
std::numeric_limits
est un type de modèle qui peut être instancié avec d'autres types:En C:
puis utilisez
ou
la source
min
est la valeur positive minimale , alors que l'entiermin
est la valeur minimale. Il en va de même pour les macros / constantes C.uint64_t
etint64_t
, pas deint
.#include <limits>
etint imax = std::numeric_limits<int>::max();
, mais j'obtiens l'erreurCan't resolve struct member 'max'
. Des idées sur pourquoi cela se produit et comment y remédier? J'utilise CLion IDE, avec CMake et C ++ 11 sur Ubuntu 14.04. Je pense que c'est lié à ce problèmeJe sais que c'est une vieille question mais peut-être que quelqu'un peut utiliser cette solution:
Jusqu'à présent, nous avons -1 comme résultat 'jusqu'à ce que la taille soit un entier signé.
Comme le dit Standard, les bits décalés sont 1 si la variable est signée et négative et 0 si la variable serait non signée ou signée et positive.
Comme la taille est signée et négative, nous décalerions le bit de signe qui est 1, ce qui n'aide pas beaucoup, nous avons donc converti en unsigned int, forçant à passer à 0 à la place, définissant le bit de signe à 0 tout en laissant tous les autres bits rester à 1.
Nous pourrions également utiliser un masque et un xor, mais nous devions ensuite connaître la taille exacte en bits de la variable. Avec le décalage des bits avant, nous n'avons pas besoin de savoir à tout moment combien de bits l'int a sur la machine ou le compilateur ni d'inclure des bibliothèques supplémentaires.
la source
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
la source
numeric_limits<int>::max()
- fonctionne également dans des contextes de modèle, mais (pour une raison insondable à mes yeux) ne peut pas être utilisé comme constante de compilation.INT_MAX
- est une macro, assez inutile dans les fonctions de modèle, mais peut être utilisée comme constante de compilation.Voici une macro que j'utilise pour obtenir la valeur maximale des entiers signés, qui est indépendante de la taille du type d'entier signé utilisé, et pour laquelle gcc -Woverflow ne se plaindra pas
la source
Pourquoi ne pas écrire un morceau de code comme:
la source
OK Je n'ai ni représentant pour commenter la réponse précédente (de Philippe De Muyter) ni augmenter son score, d'où un nouvel exemple utilisant son define pour SIGNED_MAX trivialement étendu pour les types non signés:
Contrairement à l'utilisation de tel ou tel en-tête, nous utilisons ici le type réel du compilateur.
la source
Cela peut dépendre de l'architecture, mais cela fonctionne au moins dans ma configuration.
la source
Pour la valeur maximale spécifique de int , j'écris généralement la notation hexadécimale:
au lieu de la valeur décimale irrégulière:
la source
Qu'en est-il
(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
. C'est la même chose que2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)
.Si
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]
.Vous ne pouvez pas utiliser
2*(1 << (8*sizeof(int)-2)) - 1
car il débordera, mais(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
fonctionne.la source