C 使用位移位提取单词部分时避免警告消息
假设data.msg是指向long数组(64位)的指针, 为什么这给了我下面的警告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
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));
--该转换可能会避免缩短转换消息,