Jestem zaskoczony zachowaniem C++, gdy stosuję bit-mądry, a nie unsigned char.C++ - Bit-mądry nie uchar produkuje int
Podaj wartość binarną 01010101b
, która jest 0x55
lub 85
. Zastosowanie bitowej wartości nie w ośmiobitowej reprezentacji powinno dać 10101010b
, czyli 0xAA
lub 170
.
Jednak nie mogę powtórzyć powyższego w C++. Poniższy prosty asercja nie powiedzie się.
assert(static_cast<unsigned char>(0xAAu) == ~static_cast<unsigned char>(0x55u));
że wydrukowane Wartości 0x55
, 0xAA
i ~0x55
(jak uchar) ze kodu. I okazuje się, że ten bit nie robi tego, czego się spodziewam.
std::cout << "--> 0x55: " << 0x55u << ", 0xAA: " << 0xAAu << ", ~0x55: "
<< static_cast<unsigned>(~static_cast<unsigned char>(0x55u)) << std::endl;
--> 0x55: 85, 0xAA: 170, ~0x55: 4294967210
Numer, który jest drukowany na ~0x55
jest równa 11111111111111111111111110101010b
, który jest 32-bitowy bitową nie stanowi 0x55
. Tak więc operator ~
działa na 32-bitowych liczbach całkowitych, nawet jeśli jednoznacznie rzutuje dane wejściowe na unsigned char
. Dlaczego?
Zastosowałem inny test, aby zobaczyć, jaki typ zwraca operator ~
. I okazuje się być int
na wejściu unsigned char
:
template <class T>
struct Print;
// inside main()
Print<decltype(~static_cast<unsigned char>(0x55))> dummy;
dała następujący błąd kompilatora, który wskazuje, że wynik jest typu int
.
error: implicit instantiation of undefined template 'Print<int>'
Print<decltype(~static_cast<unsigned char>(0x55u))> dummy;
Co robię źle? Lub, w jaki sposób uzyskać C++ do produkcji 0xAA
z ~0x55
?
Pełny kod jest here
+1: Choć jest to prawdopodobnie oczywiste, warto wspomnieć, że 'unsigned char' jest rzeczywiście (a) dolna konwersji pozycja niż 'int', i (b) pełna reprezentacja jako' int' (wszystkie 'unsigned char' wartości mogą być reprezentowane jako' int'). Tak więc promocja jest dobra. – WhozCraig
@WhozCraig, to sprawiedliwe żądanie, gotowe. –
Dziękuję za szczegółową odpowiedź! – Lemming