我使用g++ 4.1.2编译的C++代码中有以下循环:
while(1) {
int status = getStatus();
bool firstOk = status & 0x1;
bool secondOk = status & 0x2;
if(firstOk != m_firstOk) {
logStatus(1, firstOk);
m_firstOk = firstOk;
}
if(secondOk != m_secondOk) {
logStatus(2, secondOk);
m_secondOk = secondOk;
}
sleep(1);
}
请注意,logStatus()函数通过值传递其参数,因此参数不会被修改。m_firstOk和m_secondOk当然是bool类型的成员属性。
这个函数之前一直工作得很好,但最近我收到了一个报告说它没有检测到firstOk何时发生了变化。我使用gdb附加到运行的进程上,当我看到以下内容时,我感到非常惊讶:
(gdb) p m_firstOk
$1 = true
(gdb) p m_secondOk
$2 = true
(gdb) p firstOk
$3 = 244
什么鬼?当firstOk应该是0x1的按位与结果时,怎么会变成244呢?我知道布尔值实际上是存储为整数,但我的按位与为什么被忽略了呢?由于它是244,它被评估为true,而它应该是false,这就是问题的原因。
把按位与的结果分配给布尔值是安全的吗?这是一个gcc的错误吗?还是我应该像下面这样做?
bool firstOk = (status & 0x1) ? true : false;
感谢您的预先帮助。
status
应该是无符号的吗? - PubbyfirstOk
的值,以确保Csq所说的不再是事实。 - leemes