对布尔值使用逐位not运算符(~)是否会调用Undefined Behavior

Does using bitwise not operator (~) on boolean values invoke Undefined Behavior?

本文关键字:是否 调用 Behavior Undefined 运算符 布尔值 not      更新时间:2023-10-16

如果C++程序将按位非运算符(~)应用于布尔值,会调用Undefined Behavior吗?

例如,以下程序是否定义明确?

bool f = false;
bool f2 = ~f;    // is f2 guaranteed to be true, or is this UB?
bool t = true;
bool t2 = ~t;    // is t2 guaranteed to be false, or is this UB?

(是的,我知道有一个!运算符更适合这类事情;出于这个问题的目的,我们将忽略它的存在;)

5.3.1.10~的操作数应为整数或非整数枚举类型;结果是一个操作数的补码执行整体促销[强调矿]

4.5/6类型bool的prvalue可以转换为类型int的prvalue,其中false变为零,true变为一。

4.5/7这些转换称为积分促销

因此,~false是一个int,其比特模式由全1组成,即表示0的比特模式的补码,即全零(如3.9.1/7所要求的)。类似地,~trueint,其是1的比特表示的补码——即具有最低有效比特零的所有1。在布尔上下文中,这两个值都将计算为true

算术运算符对其操作数执行积分提升。具体地说[expr.unary.op]/9表示~也会发生这种情况。

所以~t~1是一样的。这会给出一个有效的非零整数。

整数到布尔的转换由[conv.pool]定义:

零值、空指针值或空成员指针值转换为false;任何其他值都转换为真正的

所以CCD_ 14产生CCD_。没有未定义的行为。


CCD_ 16与CCD_。在2的补码中,~0给出-1,因此我们将得到f2 == true

在1的补码中——如果有一个C++系统使用1的补号——那么~0的作用尚不清楚

bool t = true;
bool t2 = ~t;    // is t2 guaranteed to be false, or is this UB?

我想这是不能保证的,看看

  bool b = true;
  bool b1 = ~b;
  cout << b1;

输出"真实"

我想这与布尔表示有关。。。如果它是一个字节,则00000001将对不为零的11111110取反。晋升可能也在起作用,但这是一样的。

这里的关键是它是"按位"的,而不是"合乎逻辑的"。因此,除非布尔表示是一位,否则不应该期望两者匹配。

易于完全定义的行为。