Attribution d'une valeur maximale de nombre entier inférieur à un nombre entier supérieur

StackOverflow https://stackoverflow.com/questions/4073616

  •  28-09-2019
  •  | 
  •  

Question

Considérez le code suivant:

 uint32_t x = ~uint8_t(0);
 std::cout << x << std::endl;

Maintenant, je suis entièrement attendu à ce 255 de sortie, mais il 4294967295 de sortie.

Je suis au courant de la promotion entière en C ++, mais je ne peux pas comprendre pourquoi cela se passerait-il. La façon dont je comprends bien, le ~uint8_t(0) d'expression doit évaluer à 1111 1111 en binaire. L'opérateur ~ fera alors le type à être promu à un int (que je suppose est de 32 bits pour l'intérêt de la discussion), en signe étendant la valeur à 0000 0000 0000 0000 0000 0000 1111 1111. Cette valeur promu doit alors être affectée à la x lvalue, ce qui x == 255.

Mais, évidemment, je ne comprends pas cela correctement. Qu'est-ce que je manque?

Était-ce utile?

La solution

Les promotions intégrales sont effectuées sur l'opérande de l'~ unaire, de sorte que le uint8_t(0) est promu int puis le ~ est évaluée. Il est équivalent à

~(int)(uint8_t)0

Vous pouvez obtenir la valeur maximale représentable par un type en utilisant std::numeric_limits<T>::max(); si le type est non signé, vous pouvez aussi jeter -1 à ce type:

uint32_t x = (uint8_t)-1;

Autres conseils

Dans votre exemple, fait la promotion de son opérande à un ~ l'opérateur NOT au niveau (de int) avant son exécution. Il est ensuite converti en un unsigned int par la cession.

Voici quelques exemples de code connexes qui font de ce plus clair:

uint8_t y = ~uint8_t(0);
uint32_t x = y;
std::cout << x << std::endl;
  

255

uint8_t y = uint8_t(0);
int z = ~y;
uint32_t x = z;
std::cout << x << std::endl;
  

4294967295

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top