c++ 位域和-Wconversion

标签 c++ g++ warnings bit-fields

-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 = (unsigned int)a;
    f.z = (unsigned char)a; // no warning, sizeof(char) < 17
    f.z = (unsigned short)a; // no warning, sizeof(char) < 17
    f.z = (unsigned)a;
}

编译输出:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
<snip>
$ g++ -Wconversion test.cpp
test.cpp: In function ‘int main(int, char**)’:
test.cpp:13:8: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:14:22: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:15:23: warning: conversion to ‘unsigned char:4’ from ‘unsigned char’ may alter its value [-Wconversion]
test.cpp:16:24: warning: conversion to ‘unsigned char:4’ from ‘short unsigned int’ may alter its value [-Wconversion]
test.cpp:17:18: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:19:8: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:20:22: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:22:24: warning: conversion to ‘short unsigned int:9’ from ‘short unsigned int’ may alter its value [-Wconversion]
test.cpp:23:18: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:25:8: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:26:22: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:29:18: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion]

我想为我项目的其他部分(包括在这个文件中)启用-Wconversion。我如何“修复”此处的赋值语句,以免收到警告?

最佳答案

确保转换不会溢出。这是一种方法:

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 = static_cast<unsigned int>(a & 15);    
    f.y = static_cast<unsigned int>(a & 511);   
    f.z = static_cast<unsigned int>(a & 131071);
}

关于c++ 位域和-Wconversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10191886/

相关文章:

linux - 在段错误 : Is there a way, 之后检查指针是否仍然有效?

c++ - cout 在对象实例化后不输出

c# - 找到最好的区间匹配结果

c++ - CMake 链接器找不到不以 "lib"开头的库

c++ - 内联命名空间和扩展命名空间

c++ - 为什么省略 push_back 会使循环运行得更慢?

c++ - 如何修复此 vs10 不一致的 dll 链接警告?

c++ - 在 if 语句中沉默 -Wunused-variable

python - 捕获 matplotlib 警告

c++ - 使用 SFINAE 根据函数的特定重载是否存在来选择函数