Domanda

Si consideri il seguente codice:

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

Ora, io si aspettava questo per 255 uscita, ma invece è uscita 4294967295.

Sono consapevole di promozione interi in C ++, ma non riesco a capire perché questo sarebbe accaduto. Il modo in cui ho capito, il ~uint8_t(0) espressione dovrebbe valutare a 1111 1111 in binario. L'operatore ~ sarà quindi causare il tipo da essere promosso a un int (che darò per scontato è a 32 bit per il bene della discussione), dal segno estendendo il valore 0000 0000 0000 0000 0000 0000 1111 1111. Questo valore promosso dovrebbe poi essere assegnato al x lvalue, con conseguente x == 255.

Ma ovviamente non sto capire questo correttamente. Che cosa mi manca?

È stato utile?

Soluzione

Le promozioni integrali vengono eseguite sulla operando della ~ unario, così il uint8_t(0) viene promosso int e poi la ~ viene valutata. E 'equivalente a

~(int)(uint8_t)0

È possibile ottenere il valore massimo rappresentabile da un tipo utilizzando std::numeric_limits<T>::max(); se il tipo non è firmato, è anche possibile lanciare -1 a quel tipo:

uint32_t x = (uint8_t)-1;

Altri suggerimenti

Nel tuo esempio, il bit a bit senza operatore (~) sta promuovendo il suo operando a un int prima di eseguire. Questo viene poi convertita in un unsigned int dalla assegnazione.

Ecco alcuni esempi di codice relativi che rendono questo più chiaro:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top