Obtention du nombre entier non signé maximum avec bit à bit, valeur nulle

J’essaie d’obtenir la valeur maximale d’un certain type entier non signé sans inclure d’en-têtes tels que . Alors j’ai pensé que je retournerais simplement les bits de la valeur entière non signée 0.

 #include  #include  int main() { std::cout << (~0U) << '\n'; // #1 std::cout << (std::numeric_limits::max()) << '\n'; // #2 return 0; } 

Je ne suis pas très expérimenté sur les différences subtiles entre eux. C’est pourquoi je demande si un comportement inattendu ou des problèmes de plate-forme / d’architecture pourraient se produire en utilisant la première méthode.

… pour obtenir la valeur maximale d’un certain type entier non signé sans inclure les en-têtes

Atsortingbuez simplement la valeur -1

 unsigned_type_of_choice max = -1; 

La conversion de -1 , qui est un entier, en un type non signé, donne la valeur numéro supérieure à la plus grande valeur moins 1.

Ce qui suit ne fournit pas la valeur maximale du type de destination. Il échoue lorsque la plage de types de destination dépasse la plage de unsigned , qui est le type de ~0U . @Christopher Oicles

 // problem unsigned_type_of_choice max_wannabe = ~0U; 

Vous ne devriez pas assigner ~0U à n’importe quel type non signé, la réponse de chux explique déjà pourquoi.

Pour C ++, vous pouvez obtenir la valeur maximale possible pour tous les types non signés.

 template  T max_for_unsigned_type() { return ~(static_cast (0)); } 

Vous niez un zéro de votre type exact . J’utilise un nom de fonction détaillé car il ne devrait pas être utilisé pour les valeurs signées. Le problème est que pour vérifier la signature, le moyen le plus simple consiste à inclure un en-tête supplémentaire, à savoir type_traits . Cette autre réponse serait alors utile.

Usage:

 max_for_unsigned_type (); max_for_unsigned_type (); max_for_unsigned_type (); max_for_unsigned_type (); max_for_unsigned_type (); 

Valeurs renvoyées: (voir le code de test ici )

 255 65535 4294967295 18446744073709551615 4294967295 

Remarque: Il est beaucoup plus difficile de le faire pour les types signés, voir Détermination par programme de la valeur maximale d’un type entier signé .