将 uint8_t 与 C++ 中的十六进制进行比较
Compare uint8_t with hexadecimal in C++
假设我有 uint8_t bytes[maxBytes];
。
现在我想比较第一个字节(bytes[0]
)的低6位与0x3c
。
我试过这样做:
bytes[0] & 0x3f == 0x3c
不幸的是,这没有产生预期的结果。 (即它总是错误的,即使当我打印出 bytes[0] & 0x3f
时,它是 0x3c
)
我已经尝试了更多,发现
bytes[0] & 0x00 == 0x00
有时是真的,有时是假的。 (与 bytes[0] & 0x0 == 0x0
和 bytes[0] & 0x00 == 0x0
相同)。它不应该永远是真的吗?
这是怎么回事?我怎样才能使我的 0x3c
比较有效?
Sitenote:我 运行 这段代码在带有 atmega328pb MCU 的 arduino 上。
你需要括号:
(bytes[0] & 0x3f) == 0x3c
这是因为 &
和 |
的奇怪优先级是从 C 继承的,而 C 又从 B 继承了它们(Dennis Ritchie 在 https://www.bell-labs.com/usr/dmr/www/chist.html 中描述了这个优先级问题)。
假设我有 uint8_t bytes[maxBytes];
。
现在我想比较第一个字节(bytes[0]
)的低6位与0x3c
。
我试过这样做:
bytes[0] & 0x3f == 0x3c
不幸的是,这没有产生预期的结果。 (即它总是错误的,即使当我打印出 bytes[0] & 0x3f
时,它是 0x3c
)
我已经尝试了更多,发现
bytes[0] & 0x00 == 0x00
有时是真的,有时是假的。 (与 bytes[0] & 0x0 == 0x0
和 bytes[0] & 0x00 == 0x0
相同)。它不应该永远是真的吗?
这是怎么回事?我怎样才能使我的 0x3c
比较有效?
Sitenote:我 运行 这段代码在带有 atmega328pb MCU 的 arduino 上。
你需要括号:
(bytes[0] & 0x3f) == 0x3c
这是因为 &
和 |
的奇怪优先级是从 C 继承的,而 C 又从 B 继承了它们(Dennis Ritchie 在 https://www.bell-labs.com/usr/dmr/www/chist.html 中描述了这个优先级问题)。