为什么增加uint8_t的代码包括`& 0xFF`?

时间:2015-02-04 13:42:55

标签: c embedded xilinx

在阅读Xilinx的DMA示例代码时,我遇到了这段代码:

value = (value + 1) & 0xFF

其中value是uint8_t。

& 0xFF有什么意义?为什么不简单地写value = value + 1

2 个答案:

答案 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兼容版本)。