当按位而不是无符号字符应用时,我对 C++ 的行为感到惊讶。
取二进制值01010101b
,即0x55
或85
。不按位应用八位表示应该产生10101010b
,即0xAA
,或170
。
但是,我无法在 C++ 中重现上述内容。以下简单断言失败。
assert(static_cast<unsigned char>(0xAAu) == ~static_cast<unsigned char>(0x55u));
我用下面的代码打印了0x55
、0xAA
和~0x55
(as uchar) 的值。它表明按位不做我期望它做的事情。
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
。因此,~
即使我将输入显式转换为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;
我究竟做错了什么?0xAA
或者,我如何让 C++ 生成~0x55
?
完整代码在这里