你可以在C ++中逐位转换bool吗?

时间:2017-11-22 16:29:25

标签: c++ bit-shift

我正在使用其他用旧编译器编写的代码,该编译器将特殊BOOL类型映射到unsigned int,但在我的编译器中,它映射到真bool。在他的代码中的某些地方,他使用<<类型的按位移位运算符bool,这是我以前从未见过的,当我没有抱怨时,我的编译器让我感到惊讶。

这是有效的C ++吗? bool会自动升级为int还是uint

我看到了this related question,它提供了另一个问题的清晰度,但它没有解决移位运算符。

3 个答案:

答案 0 :(得分:10)

来自转换运算符 [expr.shift]

  

操作数应为整数或无范围的枚举类型,并执行整体促销。   结果的类型是提升的左操作数

的类型

bool是一个整数类型,因此代码格式正确(bool被提升为int,结果为int。)

[conv.prom]开始,我们展示了布尔人被提拔的整数:

  

bool类型的prvalue可以转换为int类型的prvalue,false变为零,真正成为one

之后,转变表现正常。 (谢谢,@ chris)

答案 1 :(得分:1)

值得对其他人指出的内容进行一些解释:按位移位 bool 被转换为 int

bool b = true;
bool d = b << 1;
printf("%d\n", d);

此代码段在屏幕上打印 1 而不是 0。原因是 b << 1 被转换为 int,即 2(二进制 10)。然后将结果转换为 bool。如果 0 的值为 int,否则后一种转换为 0,否则为 1。由于 int 的值为 2d 存储 1

移动 bool 的正确方法是将它与按位 AND (&) 和 true (1) 一起使用。

bool d = (b << 1) & 1;

AND 操作强制将左侧强制转换为 bool

答案 2 :(得分:0)

移动bool的结果类型总是int,无论右侧是什么。