Я следующий цикл в C++, скомпилирован с г ++ 4.1.2:C++: Назначение результат побитового И к BOOL
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 member.
Это работало до сих пор. Я получил сообщение о том, что он не обнаружил, когда firstOk изменился. Я подключил к запущенному процессу с помощью gdb. Это было во время сна(), и я был поражен, когда увидел следующее:
(gdb) p m_firstOk
$1 = true
(gdb) p m_secondOk
$2 = true
(gdb) p firstOk
$3 = 244
WTF? Как firstOk может быть 244, когда он должен быть результатом побитового AND с 0x1? Я знаю, что логическое значение фактически хранится как целое число, но как его побитовое И игнорировать? Поскольку это 244, он оценивается как истинный, когда он должен быть ложным, что является причиной проблемы.
Не назначает результат побитового и логическому безопасному? Это ошибка gcc? Или я должен сделать что-то вроде следующего?
bool firstOk = (status & 0x1) ? true : false;
Заранее спасибо.
Звучит как неопределенное поведение. –
Не должно ли 'status' быть без знака? – Pubby
Вы уверены, что 'firstOk' существует во время вызова' sleep() '? Поскольку это простой bool и он больше не используется, он может быть повторно использован для чего-то другого. Что говорит 'logStatus()' say? – Csq