C 使用位移位提取单词部分时避免警告消息

C 使用位移位提取单词部分时避免警告消息,c,bit-manipulation,C,Bit Manipulation,假设data.msg是指向long数组(64位)的指针, 为什么这给了我下面的警告 uint16_t messageSize = 0; messageSize |= (uint16_t)(data.msg[0] & 0x00000000000000FF); 输出 warning: convertion to 'uint16_t {aka short unsigned int}' from 'int' 如果我删除uint16的强制转换,我会收到相同的消息,但它显示的是long而不是in

假设data.msg是指向long数组(64位)的指针, 为什么这给了我下面的警告

uint16_t messageSize = 0;
messageSize |= (uint16_t)(data.msg[0] & 0x00000000000000FF);
输出

warning: convertion to 'uint16_t {aka short unsigned int}' from 'int'

如果我删除uint16的强制转换,我会收到相同的消息,但它显示的是long而不是int。不管怎样,我得到的是正确的值,只是失去了精度,我想释放,但我正在尝试消除警告。

您得到这些警告,因为在make文件中有人在使用该标志“-Wconversion”。这是一个非常保守的标志,警告可能会丢失精度。这并不意味着值实际上有任何错误

更常见的标志(-Wall,-Werror,-Pendactic)不调用-Wconversion。据我所知,必须显式调用它

我写了一个与您描述的行为非常相似的示例:

uint8_t func(uint16_t i)
{
    uint8_t out = 0;
    out |= i;
    return out;
}

int main()
{
    long l;
    uint8_t i;
    l = 0xFFFFFFFFFFFFFFFF;  // -1 (unsigned)
    printf("Initial Long: %ld\n", l);
    i = func(l);
    printf("8 bits: %d\n", i);  // value: 255
}
我尝试了多种C和C++标准,我只是在
时得到警告。 -使用了Wconversion。此代码完全按照它应该的方式执行。只要您获得要查找的值,我就会怀疑-Wconversion是否需要在make文件中,或者使用#pragma忽略它,如下所示:

#pragma GCC diagnostic ignored "-Wconversion"

msg
的类型是什么?data.msg是指向长数组的指针。
conversion
?您确定吗?无法在此处复制。(已尝试发出所有警告的叮当声和gcc)关于
(uint8_t)(data.msg[0])呢
?这会更简单,并且做同样的事情。请注意,
a |=b
a=a | b
的简写,除了
a
计算一次(如果
a
实际上拼写为
t->p[q++]->r[j-->。假定通过将两个参数提升为
int
然后计算表达式来计算
a | b
,则赋值将缩短
int
结果并触发消息。您的强制转换不会更改表达式。请尝试
messagesize=(uint16_t)(messagesize |(data.msg[0]&0xFF));
--该转换可能会避免缩短转换消息,