2012-04-17 27 views
7

-Wconversion đang tạo cảnh báo khi gán giá trị cho trường bit với g ++.trường C++ bit và -Wconversion

tập tin Nguồn:

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

Compilation đầu ra:

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

Tôi muốn -Wconversion kích hoạt cho các phần khác của dự án của tôi (bao gồm trong tập tin này). Làm cách nào để "sửa" các câu lệnh gán ở đây để tôi không nhận được cảnh báo?

+0

Điều gì sẽ xảy ra nếu bạn tắt 'int'? –

+0

@ 0A0D xem nội dung cập nhật. – robert

Trả lời

11

Đảm bảo chuyển đổi không thể tràn. Dưới đây là một cách:

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

Điều đó có hiệu quả. Cảm ơn. – robert

-1

Wconversion sẽ cung cấp cho cảnh báo mỗi khi có một khả năng rằng chuyển đổi ngầm của bạn có thể thay đổi giá trị của bạn. Điều đó đã được nói, không có vấn đề với mã của bạn.

Sử dụng static_cast<usigned_int> vì đề cập ở trên sẽ khắc phục được sự cố của bạn.

Some more information

Các vấn đề liên quan