Zuweisen max-Wert von kleiner ganzen Zahl auf eine größere ganze Zahl ist
-
28-09-2019 - |
Frage
Betrachten Sie den folgenden Code ein:
uint32_t x = ~uint8_t(0);
std::cout << x << std::endl;
Nun, ich erwartet habe diese voll zur Ausgabe 255
, sondern es Ausgabe 4294967295
.
Ich bin mir dessen bewusst integer Förderung in C ++, aber ich kann nicht verstehen, warum dies geschehen würde. So wie ich es verstehe, sollte der Ausdruck ~uint8_t(0)
bewerten binär 1111 1111
. Der ~
Operator wird dann bewirken, dass der Typ in eine int
gefördert werden (was ich davon ausgehen, werden 32-Bit zum Zwecke der Diskussion), durch Zeichen um den Wert zu 0000 0000 0000 0000 0000 0000 1111 1111
erstreckt. Dies förderte Wert sollte dann auf den L-Wert x
zugeordnet werden, in x == 255
führt.
Aber natürlich bin ich das nicht richtig zu verstehen. Was bin ich?
Lösung
Die integrierten Aktionen sind auf den Operanden des einstelligen ~
ausgeführt, so dass die uint8_t(0)
zu int
gefördert werden, und dann wird die ~
ausgewertet. Es ist äquivalent zu
~(int)(uint8_t)0
Sie können den Maximalwert darstellbare von einem Typ mit std::numeric_limits<T>::max()
erhalten; wenn der Typ nicht signiert ist, können Sie auch -1
auf diese Art werfen:
uint32_t x = (uint8_t)-1;
Andere Tipps
In Ihrem Beispiel die bitweise nicht Operator (~
) fördert seine Operanden zu einem int
bevor sie ausgeführt wird. Dies wird dann umgewandelt in eine unsigned int
durch die Zuordnung.
Hier sind einige relevante Codebeispiele, die diese mehr deutlich machen:
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