相关疑难解决方法(0)

为什么>> 24导致-Wconversion但是>> 23不?

这是代码:

#include <stdint.h>

unsigned char f(uint32_t RGBA)
{
  return (RGBA>>24) & 0xFF;
}
Run Code Online (Sandbox Code Playgroud)

当使用-Wconversion它编译导致"警告:从'uint32_t {aka unsigned int}'转换为'unsigned char''可能会改变其值[-Wconversion]".如果我将移位值降低到23或更低,则警告消失.

我查看了C99标准,我不明白这里发生了什么.如果我删除了&运算符,那么总是会发出警告,这可能是好的,因为表达式(在整数提升之后)的结果大于unsigned char.我唯一的想法是,对于较小的班次省略警告只是因为gcc是聪明的并且看到结果仍然是8位,因为标准不会使这成为特殊情况.我在这儿吗?

为什么班次价值很重要?这是GCC的错误吗?Clang似乎没有为任何班次值产生警告.

我在64位Linux系统上使用GCC 5.3.1.

c gcc compiler-warnings implicit-conversion

10
推荐指数
1
解决办法
213
查看次数

c ++位字段和-Wconversion

-Wconversion 当我用g ++为一个位字段赋值时,会产生警告.

源文件:

struct Foo
{
public:
    unsigned int x : 4;
    unsigned int y : 9;
    unsigned int z : 17;
};

int main(int, char**)
{
    int a = 12;
    Foo f;
    f.x = a;
    f.x = (unsigned int)a;
    f.x = (unsigned char)a;
    f.x = (unsigned short)a;
    f.x = (unsigned)a;

    f.y = a;
    f.y = (unsigned int)a;
    f.y = (unsigned char)a; // no warning, sizeof(char) < 9
    f.y = (unsigned short)a;
    f.y = (unsigned)a;

    f.z = a;
    f.z …
Run Code Online (Sandbox Code Playgroud)

c++ warnings g++ bit-fields

9
推荐指数
1
解决办法
2391
查看次数