C++ 中 true 的补码为何仍是 true?
The complement of true is true, except when it's false

最近我在研究 P4313R1 提案时,发现 C++ 位运算中一个令人费解的角落。当对 bool 类型执行按位取反操作时,由于 integral promotion 机制,true 会被提升为 int 的 1,取反后得到 -2,再转回 bool 时因非零特性又变回了 true。这意味着 static_cast<bool>(~true) 的结果竟然是 true。更复杂的是,gcc 在处理基于 bool 的 enum 时表现与 Clang 和 MSVC 不同,甚至可能触发未定义行为。这篇文章深入剖析了 C++ 标准中关于类型提升、布尔转换以及未定范围 enum 的微妙规则,揭示了这些看似无害的操作背后潜藏的逻辑陷阱和编译器差异。
这就是真相:true 的补码是 true,用 C++ 代码表达就是 static_cast<bool>(~true) 等于 true。