unsigned char ではなくビット単位で適用する場合の C++ の動作には驚かされます。
、またはのバイナリ値01010101b
を取ります。8ビット表現ではなくビットごとに適用すると、 、または.0x55
85
10101010b
0xAA
170
ただし、上記を C++ で再現することはできません。次の単純なアサーションは失敗します。
assert(static_cast<unsigned char>(0xAAu) == ~static_cast<unsigned char>(0x55u));
0x55
、0xAA
、および~0x55
(uchar として)の値を次のコードで出力しました。そして、ビット単位の not が期待どおりに機能しないことがわかります。
std::cout << "--> 0x55: " << 0x55u << ", 0xAA: " << 0xAAu << ", ~0x55: "
<< static_cast<unsigned>(~static_cast<unsigned char>(0x55u)) << std::endl;
--> 0x55: 85, 0xAA: 170, ~0x55: 4294967210
出力される数値~0x55
は と等しく11111111111111111111111110101010b
、これは の 32 ビット ビット単位ではありません0x55
。そのため、入力を に明示的にキャストしても、~
演算子は 32 ビット整数で動作していunsigned char
ます。何故ですか?
別のテストを適用して、~
演算子が返す型を確認しました。int
そして、それは入力上にあることが判明しましたunsigned char
:
template <class T>
struct Print;
// inside main()
Print<decltype(~static_cast<unsigned char>(0x55))> dummy;
次のコンパイラ エラーが発生します。これは、結果の型が であることを示しますint
。
error: implicit instantiation of undefined template 'Print<int>'
Print<decltype(~static_cast<unsigned char>(0x55u))> dummy;
私は何を間違っていますか?または、C++ を から生成するにはどうすればよい0xAA
です~0x55
か?
完全なコードはこちら