繁体   English   中英

C ++运算符&带有枚举的结果为false

[英]C++ operator & with enum evaluates to false

以下代码输出reportAllDataRanges = 0。

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? (大于零)?

我认为您正在使用<Windows.h>标头中的BOOLEAN类型,该类型是BYTE类型的typedef,这是未指定char类型的typedef,可以容纳0-255之间的值,而不是3070 & 512表达式所对应的3070 & 512评估。 有一个溢出导致值0等于FALSE

我猜发生的是BOOLEAN是1字节类型的typedef。 例如,在Microsoft的Windows标头中,它是unsigned charlink )的typedef。

3070 & 512值为512 512分配给unsigned char会得出0的结果。

为避免此问题,您可以执行以下操作之一:

  • 使用bool代替BOOLEAN
  • 使用!!(x & y)代替x & y
  • 使用(x & y) == y

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM