Attribution d'une valeur maximale de nombre entier inférieur à un nombre entier supérieur
-
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?
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