【发布时间】:2014-09-29 13:37:13
【问题描述】:
我对 C++ 在按位应用而不是无符号字符时的行为感到惊讶。
取二进制值01010101b,即0x55,或85。对 8 位表示不按位应用应该会产生 10101010b,即 0xAA 或 170。
但是,我无法在 C++ 中重现上述内容。以下简单断言失败。
assert(static_cast<unsigned char>(0xAAu) == ~static_cast<unsigned char>(0x55u));
我使用以下代码打印了0x55、0xAA 和~0x55(作为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,这不是0x55 的32 位位。因此,~ 运算符对 32 位整数进行操作,即使我将输入显式转换为 unsigned char。这是为什么呢?
我应用了另一个测试来查看~ 运算符返回的类型。结果在unsigned char 输入上是int:
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++ 从 ~0x55 生成 0xAA?
完整代码是here
【问题讨论】:
标签: c++ bit-manipulation integer-promotion