为什么这个递增uint8_t的代码包含`&0xFF`?

The*_*man 18 c embedded xilinx

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

value = (value + 1) & 0xFF
Run Code Online (Sandbox Code Playgroud)

其中value是uint8_t.

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

Min*_*s97 18

我的猜测是,这个代码的目的,甚至如果正确的工作value不是 1字节(8位)型.位掩码0xFF确保仅保留值的最后一个字节.

  • 在赋值期间转换回`uint8_t`已经确保只保留值的最后一个字节.所以我不相信这个答案是正确的.更有可能的是,屏蔽是为了使整数提升引起的编译器警告静音.看我的回答. (2认同)

Lun*_*din 10

当您想要避免隐式类型促销问题时,或者当您只是希望证明在编写代码时已经考虑过隐式促销时,这种代码很常见,这是一种很好的编程习惯.

uint8_t是一个小整数类型,因此int无论何时在表达式中使用它都会被提升.结果(value + 1)总是如此int.

如果没有屏蔽,一些编译器会发出警告,例如"尝试在uint8_t中存储int".我在几个编译器上遇到过这样的警告.理论上int & 0xFF它仍然是一个int,但由于它不能有大于0xFF的值,编译器很可能将类型优化到uint8_t并且警告将消失.

或者,您可以编写value = (uint8_t)(value + 1u);具有相同含义的内容(但是代码的MISRA-C兼容版本).

  • @ user2010913你的意思是0,而不是255. (2认同)
  • @ user2010913如果值达到0x100(256),1将被切断,它会回到0或者我疯了吗? (2认同)