我们正在使用启用了-Wconversion
的gcc进行编译。当我离开下面的isBitSet
函数返回的移位结果时,出现以下警告。
警告:从“ int”转换为“ u_int16_t {aka short unsigned int}”
可能会改变其值[-Wconversion]
#include <stdint.h>
using namespace std;
void convertToPos(uint16 in) {
auto isBitSet = [&in](uint8_t position) -> bool{
return (in & (1 << position));
};
uint16_t signal = 0;
signal |= isBitSet(1) << 9; // Calibrated
signal |= isBitSet(2) << 10; // Corresponds to digital map
signal |= isBitSet(5) << 13; // DR
signal |= isBitSet(8) << 15; // 3D Fix
}
int main(int argc)
{
convertToPos(4);
return 0;
}
我尝试将lambda更改为以下值,但仍然收到相同的错误。我该如何解决?
auto isBitSet = [&in](uint8_t position) -> uint16_t {
return (in & (1 << position)) ? 1u:0u;
};
最佳答案
为避免警告,您可以执行以下操作:
signal = uint16_t(signal | isBitSet(1u) << 9);
因为
operator |
将运算符uint16_t
提升为int
。