在阅读Xilinx的DMA示例代码时,我遇到了这段代码:
value = (value + 1) & 0xFF
其中value是uint8_t。
& 0xFF
有什么意义?为什么不简单地写value = value + 1
?
答案 0 :(得分:18)
我的猜测是,即使value
不是 1字节(8位)类型,此代码也可以正常工作。位掩码0xFF
确保只保留值的最后一个字节。
答案 1 :(得分:10)
当您想要避免implicit type promotions出现问题时,或者当您只是希望证明在编写代码时已经考虑过隐式促销时,这种代码很常见,这是一种很好的编程习惯。
uint8_t
是一个小整数类型,因此无论何时在表达式中使用它,它都会被提升为int
。 (value + 1)
的结果始终为int
。
没有屏蔽,一些编译器会发出警告,例如"尝试在uint8_t"中存储int。我在几个编译器上遇到过这样的警告。理论上int & 0xFF
仍然是一个int,但由于它的值不能大于0xFF,编译器很可能将类型优化为uint8_t,警告就会消失。
或者您可以编写具有相同含义的value = (uint8_t)(value + 1u);
(但是代码的MISRA-C兼容版本)。