我正在使用其他用旧编译器编写的代码,该编译器将特殊BOOL
类型映射到unsigned int
,但在我的编译器中,它映射到真bool
。在他的代码中的某些地方,他使用<<
类型的按位移位运算符bool
,这是我以前从未见过的,当我没有抱怨时,我的编译器让我感到惊讶。
这是有效的C ++吗? bool
会自动升级为int
还是uint
?
我看到了this related question,它提供了另一个问题的清晰度,但它没有解决移位运算符。
答案 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
的值为 2
,d
存储 1
。
移动 bool 的正确方法是将它与按位 AND
(&
) 和 true
(1
) 一起使用。
bool d = (b << 1) & 1;
此 AND
操作强制将左侧强制转换为 bool
。
答案 2 :(得分:0)
移动bool的结果类型总是int,无论右侧是什么。