Sono sorpreso dal comportamento di C++ quando si applica bit-saggio non a un carattere senza segno.C++ - Bit-wise non di uchar produce int
Prendere il valore binario 01010101b
, che è 0x55
o 85
. L'applicazione del bit-wise su una rappresentazione a otto bit dovrebbe produrre 10101010b
, ovvero 0xAA
o 170
.
Tuttavia, non riesco a riprodurre quanto sopra in C++. La seguente semplice asserzione fallisce.
assert(static_cast<unsigned char>(0xAAu) == ~static_cast<unsigned char>(0x55u));
ho stampato i valori di 0x55
, 0xAA
, e ~0x55
(come uchar) con il seguente codice. E rivela che il bit-saggio non fa ciò che mi aspetto che faccia.
std::cout << "--> 0x55: " << 0x55u << ", 0xAA: " << 0xAAu << ", ~0x55: "
<< static_cast<unsigned>(~static_cast<unsigned char>(0x55u)) << std::endl;
--> 0x55: 85, 0xAA: 170, ~0x55: 4294967210
Il numero stampato per ~0x55
è uguale a 11111111111111111111111110101010b
, che è a 32 bit a bit non di 0x55
. Pertanto, l'operatore ~
sta funzionando su numeri interi a 32 bit anche se immetto espressamente l'input su un unsigned char
. Perché?
Ho applicato un altro test per verificare quale tipo restituisce l'operatore ~
. E si scopre essere int
su un unsigned char
ingresso:
template <class T>
struct Print;
// inside main()
Print<decltype(~static_cast<unsigned char>(0x55))> dummy;
restituisce il seguente errore di compilatore, che indica che il risultato è di tipo int
.
error: implicit instantiation of undefined template 'Print<int>'
Print<decltype(~static_cast<unsigned char>(0x55u))> dummy;
Cosa sto facendo male? Oppure, come posso ottenere C++ per produrre 0xAA
da ~0x55
?
codice completa è here
+1: Anche se è probabile che ovvio, vale la pena ricordare che 'char' senza segno è in effetti (a) di conversione più bassa rank di 'int', e (b) full rappresentabile come' int' (tutti i valori di 'char unsigned 'possono essere rappresentati come' int'). Quindi la promozione è valida. – WhozCraig
@WhozCraig è una richiesta giusta, fatta. –
Grazie per la risposta dettagliata! – Lemming