2017-05-09 3 views
0

ツールセットv141でVisual Studio Enterprise 2017バージョン15.1(26403.7)を使用しています。(Visual C++ v141)ビット単位のコンパイルが正しくない

次のコードは正しくコンパイルされていないようです。 Visual Studioで

#define GMASK(rangeStart, rangeEnd) ((1 << (rangeEnd - rangeStart + 1)) - 1) 
uint32_t _gmask(uint32_t rangeStart, uint32_t rangeEnd) 
{ 
    return ((1 << (rangeEnd - rangeStart + 1)) - 1); 
} 

int main() 
{ 
    cout << bitset<32>(GMASK(0, 31)) << endl; 
    cout << bitset<32>(_gmask(0, 31)) << endl; 

    return 0; 
} 

出力は

11111111111111111111111111111111 
00000000000000000000000000000000 

しかし、GCCで出力が

11111111111111111111111111111111 
11111111111111111111111111111111 

なぜそれは同じコードだ出力に違いがありますか?

+0

あなたは整数変換ルールを使い、結果として未定義の動作を得ています。 – paddy

答えて

1

これは未定義の動作です。

コードでは、_gmask(0, 31)を計算すると、値2 が使用されます。すなわち、0から2 に及ぶ可能性がuint32_tの範囲外で既にだ - C++ 14の5.8シフト演算子から1

E1 <の値< E2はE1残されシフトE2ビット位置;空白のビットはゼロで埋められます。 E1の符号なしの型がある場合、結果の値はE1×2 E2であり、結果の型の最大値である よりも1を法としています。それ以外の場合、E1が符号付きの型で負でない値を持ち、E1×2 E2が結果タイプの対応する符号なしタイプで表現可能である場合、結果タイプに変換されたその値は結果の値です。それ以外の場合、動作は未定義です。

+0

ああ、それはgccで働いていたのはまだ変わっています。 –

関連する問題