2017-02-08 3 views
1

folgenden Code Ausgänge reportAllDataRanges = 0.C++ Operator & ENUM Ergebnis falsch

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; 

shouldnt

BOOLEAN value = 3070 & 512; 

auf TRUE auswerten? (größer als Null)?

+0

Bitte geben Sie ein [MCVE]. Als @ M.M. weist darauf hin, wir wissen nicht, was "BOOLEAN" ist. – clcto

+0

BOOLEAN ist UCHAR. Ich glaube, das erklärt alles! Danke Jungs!!! (Ich mache Windows-Kernel-Treiber-Entwicklung :) –

Antwort

2

Ich denke, was passiert ist, dass BOOLEAN ein Typdef für einen 1-Byte-Typ ist. Z.B. in Microsoft Windows-Headern ist es ein typedef für unsigned char (link).

Der Wert 3070 & 512 ist 512. Zuweisen von 512 zu unsigned char ergibt das Ergebnis 0.

dieses Problem vermeiden Sie eine der folgenden Dinge tun:

  • Verwenden bool statt BOOLEAN.
  • Verwenden Sie !!(x & y) anstelle von x & y.
  • Verwenden Sie (x & y) == y.
3

Ich glaube, Sie BOOLEAN Typ aus dem <Windows.h> Header verwenden, die ein typedef für den BYTE Typ ist, der ein typedef für unsinged char-Typ ist, die Werte von 0 halten kann - 255 und nicht 512, an dem die 3070 & 512 Ausdruck bewertet. Es gibt einen Überlauf, der den Wert 0 ergibt, der FALSE entspricht.