Ich bin überrascht von C++ - Verhalten, wenn Bit-weise nicht auf ein vorzeichenloses Zeichen angewendet wird.C++ - Bit-weise nicht von uchar erzeugt int
Nehmen Sie den Binärwert 01010101b
, der 0x55
oder 85
ist. Bitweises Anwenden auf eine Acht-Bit-Darstellung sollte 10101010b
ergeben, was 0xAA
oder 170
ist.
Allerdings kann ich das oben in C++ nicht reproduzieren. Die folgende einfache Assertion schlägt fehl.
assert(static_cast<unsigned char>(0xAAu) == ~static_cast<unsigned char>(0x55u));
I gedruckt, die Werte von 0x55
, 0xAA
und ~0x55
(als uchar) mit dem folgenden Code. Und es zeigt, dass das bitweise nicht tut, was ich von ihm erwarte.
std::cout << "--> 0x55: " << 0x55u << ", 0xAA: " << 0xAAu << ", ~0x55: "
<< static_cast<unsigned>(~static_cast<unsigned char>(0x55u)) << std::endl;
--> 0x55: 85, 0xAA: 170, ~0x55: 4294967210
Die Zahl, die für ~0x55
gedruckt wird, ist gleich 11111111111111111111111110101010b
, die die 32-Bit-bitweise nicht von 0x55
ist. Der Operator ~
arbeitet also mit 32-Bit-Ganzzahlen, auch wenn ich die Eingabe explizit auf unsigned char
umsetze. Warum das?
Ich wandte einen anderen Test an, um zu sehen, welchen Typ der ~
Operator zurückgibt. Und es stellt sich heraus int
auf einem unsigned char
eingegeben werden:
template <class T>
struct Print;
// inside main()
Print<decltype(~static_cast<unsigned char>(0x55))> dummy;
ergibt den folgenden Compiler-Fehler, was darauf hindeutet, dass das Ergebnis vom Typ int
.
error: implicit instantiation of undefined template 'Print<int>'
Print<decltype(~static_cast<unsigned char>(0x55u))> dummy;
Was mache ich falsch? Oder, wie bekomme ich C++, 0xAA
von ~0x55
zu produzieren?
Voll Code ist here
+1: Auch wenn es nahe liegt auf der Hand, ist es erwähnenswert, dass 'unsigned char' zwar (a) geringere Umwandlung Rang als "int" und (b) vollständig als "int" darstellbar (alle Werte ohne Vorzeichen können als "int" dargestellt werden). Die Werbung ist also solide. – WhozCraig
@WhozCraig das ist eine faire Anfrage, fertig. –
Vielen Dank für die ausführliche Antwort! – Lemming