2012-04-17 2 views
7

-Wconversion은 g ++로 비트 필드에 값을 할당 할 때 경고를 생성합니다.C++ 비트 필드 및 -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 = 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; 
} 

컴파일 출력 : I (이 파일에 포함) 내 프로젝트의 다른 부분에 사용할 수 -Wconversion 원하는

$ 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] 

. 여기에 할당 문을 "수정"하여 경고를받지 않으려면 어떻게해야합니까?

+0

'int'를 사용하면 어떻게됩니까? –

+0

@ 0A0D 업데이트를 참조하십시오. – robert

답변

11

변환이 오버플로되지 않도록하십시오. 가능성이 당신의 암시 적 변환이 값을 변경할 수가

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

그게 작동합니다. 감사. – robert

-1

Wconversion 때마다 경고를 줄 것이다 : 여기 하나의 방법입니다. 즉, 코드에는 아무런 문제가 없습니다.

위의 언급대로 static_cast<usigned_int>을 사용하면 문제가 해결됩니다.

Some more information