2017-02-08 65 views
1

下面的代碼輸出reportAllDataRanges = 0C++操作員用枚舉評估爲假

BOOLEAN updateDataRanges = IsFirstUpdate || (m_uiDataRangeMode & IAdapterCommon::UpdatePinDataRanges); 
BOOLEAN updateConstrainedDataRanges = m_uiDataRangeMode & IAdapterCommon::UpdatePinConstrainedDataRanges; 
BOOLEAN reportAllDataRanges = m_uiDataRangeMode & IAdapterCommon::ReportAllDataRanges; 

DPF_ENTER(("[CAdapterCommon::UpdatePinDescriptor(%p, %lu)] - m_uiDataRangeMode = %lu, updateDataRanges = %lu, updateConstrainedDataRanges = %lu, reportAllDataRanges = %lu, a & b = %lu, b = %lu", PinDescriptor, IsFirstUpdate, m_uiDataRangeMode, updateDataRanges, updateConstrainedDataRanges, reportAllDataRanges, m_uiDataRangeMode & IAdapterCommon::ReportAllDataRanges, IAdapterCommon::ReportAllDataRanges)); 

[CAdapterCommon::UpdatePinDescriptor(FFFFF8064CCE42F0, 1)] - m_uiDataRangeMode = 3070, updateDataRanges = 1, updateConstrainedDataRanges = 64, reportAllDataRanges = 0, a & b = 512, b = 512 

typedef enum : UINT32 
{ 
    None = 0, 
    UseDataRanges = 1 << 0, 
    UseDiscreteDataRanges = 1 << 1, 
    RaiseUpdateEvent = 1 << 2, 
    RaiseUpdatePinDescriptor = 1 << 3, 
    DoNotUpdateOriginalDescriptor = 1 << 4, 
    UpdatePinDataRanges = 1 << 5, 
    UpdatePinConstrainedDataRanges = 1 << 6, 
    UseDataRangeIntersection = 1 << 7, 
    UseProposedDataFormat = 1 << 8, 
    ReportAllDataRanges = 1 << 9, 
    DataRangeIntersectionAcceptAllRanges = 1 << 10, 
    SupportedDataRangesFirst = 1 << 11, 
} DataRangeModeEnum; 

不應該

BOOLEAN value = 3070 & 512; 

評價爲TRUE? (大於零)?

+0

請提供[MCVE]。作爲@ M.M。指出,我們不知道「BOOLEAN」是什麼。 – clcto

+0

BOOLEAN是UCHAR。我相信這解釋了一切!感謝你們!!! (我在做Windows Kernel驅動程序開發):) –

回答

2

我猜想發生了什麼事是BOOLEAN是一個1字節類型的typedef。例如。在微軟的Windows頭文件中,它是一個unsigned charlink)的typedef。

3070 & 512的值是512。指定512unsigned char給出0的結果。

爲了避免這個問題,你可以做以下的事情之一:

  • 使用bool而不是BOOLEAN。使用!!(x & y)代替x & y
  • 使用(x & y) == y
3

我想你使用布爾類型從<Windows.h>頭這對於BYTE類型是用於能夠從0保存值unsinged字符型一個typedef一個typedef - 255而不是512,以該3070 & 512表達評估。有一個溢出導致值爲0,相當於FALSE