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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top