我们正在使用启用了-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

08-16 10:59