C++ (Visual C+;+;v141)按位函数编译不正确

C++ (Visual C+;+;v141)按位函数编译不正确,c++,visual-studio,visual-c++,C++,Visual Studio,Visual C++,在工具集v141上使用Visual Studio Enterprise 2017版本15.1(26403.7) 下面的代码似乎编译不正确 #define GMASK(rangeStart, rangeEnd) ((1 << (rangeEnd - rangeStart + 1)) - 1) uint32_t _gmask(uint32_t rangeStart, uint32_t rangeEnd) { return ((1 << (rangeEnd - rang

在工具集v141上使用Visual Studio Enterprise 2017版本15.1(26403.7)

下面的代码似乎编译不正确

#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;
}
然而,在gcc中,输出是

11111111111111111111111111111111
00000000000000000000000000000000
11111111111111111111111111111111
11111111111111111111111111111111

同一代码的输出为什么会有差异?

这是未定义的行为

在您的代码中,当计算gmask(0,31)时,使用值232。这已经超出了
uint32\u t
的范围,范围从0到232-1

从C++14 5.8转换运算符:


E1的值受整数转换规则的支配,结果得到了未定义的行为。啊,我明白了,但它在gcc中工作仍然很奇怪。