Assegnando il valore massimo di intera più di un intero maggiore
-
28-09-2019 - |
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?
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