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
确保仅保留值的最后一个字节.
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兼容版本).