7

unsigned char ではなくビット単位で適用する場合の C++ の動作には驚かされます。

、またはのバイナリ値01010101bを取ります。8ビット表現ではなくビットごとに適用すると、 、または.0x558510101010b0xAA170

ただし、上記を C++ で再現することはできません。次の単純なアサーションは失敗します。

assert(static_cast<unsigned char>(0xAAu) == ~static_cast<unsigned char>(0x55u));

0x550xAA、および~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か?

完全なコードはこちら

4

3 に答える 3

3

インテグラルプロモーションについての答えは正しいです。

キャストと NOT を正しい順序で行うことで、目的の結果を得ることができます。

assert(static_cast<unsigned char>(0xAAu) == static_cast<unsigned char>(~0x55u));
于 2014-10-01T03:33:08.243 に答える