2017-01-26 43 views
2

unsigned型に切り捨て、私がやったことです:大きな整数が暗黙のうちに、私はビットフィールドで可能な最大値を決定しようとしていた

using namespace std; 

struct A{ 
    unsigned int a:1; 
    unsigned int b:3; 
}; 

int main() 
{ 
    A aa; 
    aa.b = ~0U; 
    return 0; 
} 

MSVCは大丈夫ですが、GCC 4.9.2は、私に警告を与えた:

warning: large integer implicitly truncated to unsigned type [-Woverflow] 

フィールドのビット幅がわからないとすれば、どのように取り除くことができますか?その範囲を含むビットフィールドの値-表現側面は、現在、欠陥C++の標準と考えられている言語標準でunderspecifiedされていることを

aa.b = 1; 
aa.b = -aa.b; 

注意を次のように

+2

ビットフィールドは移植性がありません。 –

+0

@Neil Butterworth:基本的な型の表現を扱うC++言語の部分のほとんどすべてと同じくらい移植性がありません。 – AnT

+0

@Anいいえ、携帯性はあまりありません。 –

答えて

0

あなたはこの周囲で作業してみてください。特に、文書の他の部分(例えば列挙型の仕様)が、それ自身の目的のためにビットフィールドの表現可能な値の範囲に頼っていることを考慮すると、奇妙で​​す。これはtaken care of in the futureとなっています。

+1

これは、私が最終的に使用することを決めた回避策に似ています:aa.b = 0; --aa.b; – stanleyli

+0

@stanleyli:はい、あなたの方がさらに優れています。 – AnT

関連する問題