在C++中,你能对bool类型进行位移操作吗?

15

我正在使用别人编写的代码,它是用旧编译器编写的,将特殊的BOOL类型映射到了unsigned int,但在我的编译器中它被映射为真正的bool。他的代码中有些地方使用了bool 类型的位移运算符<<,这让我感到惊讶,因为我的编译器没有抱怨。

这是有效的C++吗?bool自动提升为intuint了吗?

我看到这个相关问题,它对另一个问题提供了一些澄清,但它没有涉及到位移操作符。


我以前见过位移操作并理解它的用途...只是我从未见过它与“bool”类型一起使用。我知道我的编译器允许这样做,但其他编译器呢?这就是我想知道的。 - Phlucious
布尔类型的位移操作在逻辑上应该做什么? - user2672107
无论它是否是有效的C++代码,如果你要将一个叫做BOOL的东西当做位数组来处理,那似乎不是一个合适的_想法_。 - Solomon Slow
@jameslarge 我也是这么想的,不过我认为他正在将bool值打包到位数组中,这就是为什么这可能是预期行为的原因。 - Phlucious
为什么要对布尔值进行位移 - 它肯定是真或假。使用 int 代替不就好了吗? - avrono
显示剩余3条评论
3个回答

12

来自位运算符[expr.shift]

操作数必须是整数或无作用域枚举类型,并进行整数提升。结果的类型是提升后的左操作数的类型。

bool是一种整数类型,所以代码是良好的(bool被提升为int,结果是一个int)。

[conv.prom]中,我们展示了布尔值提升为哪些整数:

bool类型的prvalue可以转换为int类型的prvalue,其中false变成零,true变成one

之后,移位会正常工作。(感谢,@chris)


1
该值遵循通常的布尔-整数转换。false 被转换为 0,反之亦然,而 true 被转换为 1,任何非 0 的值都被转换为 true。此时,它是一个普通的 int 移位,移位前后进行 bool 转换。 - chris
@chris:谢谢。已更新。 - AndyG
谢谢您澄清这是预期行为。您能将这些引用更新为链接吗?我不理解 [foo.bar] 语法。 - Phlucious
1
@Phlucious:我在引用标准文档。我想有一个在线草案,我可以指出来。等一下。 - AndyG
我认为基于 https://timsong-cpp.github.io/cppwp/n4659(C++17 减去一些编辑更改)而不是 http://eel.is/c++draft/(最新标准,这是“早期草案已知不完整、不正确,并且有很多糟糕的格式”)可能会更好。 - Daniel H
显示剩余2条评论

1
值得补充一些解释,其他人指出:位移一个 bool 值会被转换为 int
bool b = true;
bool d = b << 1;
printf("%d\n", d);

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

正确移位布尔值的方法是使用按位AND&)与true1)一起使用。

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

这个 AND 操作会强制将左侧转换为布尔类型。

转换,而非强制转换。强制转换是显式的转换。 - Keith Thompson

0

将 bool 进行位移的结果类型始终为 int,无论右侧是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接