C++位域和-Wconversion

12

-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。如何“修复”这里的赋值语句,以避免收到警告?


如果你把 int 去掉会发生什么? - user195488
2个回答

16

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

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);
}

-1

Wconversion 会在可能导致隐式转换改变值的情况下发出警告。话虽如此,您的代码没有问题。

如上所述,使用 static_cast<usigned_int> 将解决您的问题。

更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接