我正在使用别人编写的代码,它是用旧编译器编写的,将特殊的BOOL
类型映射到了unsigned int
,但在我的编译器中它被映射为真正的bool
。他的代码中有些地方使用了bool
类型的位移运算符<<
,这让我感到惊讶,因为我的编译器没有抱怨。
这是有效的C++吗?bool
自动提升为int
或uint
了吗?
我看到这个相关问题,它对另一个问题提供了一些澄清,但它没有涉及到位移操作符。
来自位运算符[expr.shift]
操作数必须是整数或无作用域枚举类型,并进行整数提升。结果的类型是提升后的左操作数的类型。
bool
是一种整数类型,所以代码是良好的(bool
被提升为int
,结果是一个int
)。
从[conv.prom]中,我们展示了布尔值提升为哪些整数:
bool
类型的prvalue可以转换为int
类型的prvalue,其中false
变成零,true变成one
之后,移位会正常工作。(感谢,@chris)
false
被转换为 0,反之亦然,而 true
被转换为 1,任何非 0 的值都被转换为 true
。此时,它是一个普通的 int
移位,移位前后进行 bool
转换。 - chrisbool
值会被转换为 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
的值为2
,d
存储了1
。
正确移位布尔值的方法是使用按位AND
(&
)与true
(1
)一起使用。
bool d = (b << 1) & 1;
AND
操作会强制将左侧转换为布尔类型。将 bool 进行位移的结果类型始终为 int,无论右侧是什么。
BOOL
的东西当做位数组来处理,那似乎不是一个合适的_想法_。 - Solomon Slow