C++ (Visual C+;+;v141)按位函数编译不正确
在工具集v141上使用Visual Studio Enterprise 2017版本15.1(26403.7) 下面的代码似乎编译不正确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
#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中工作仍然很奇怪。