在工具集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;}在Visual Studio中,输出为1111111111111111111111111111111100000000000000000000000000000000但是在gcc中的输出是1111111111111111111111111111111111111111111111111111111111111111相同的代码为什么输出会有所不同? 最佳答案 这是未定义的行为。在您的代码中,当计算_gmask(0, 31)时,将使用值232。这已经超出了uint32_t的范围,该范围可以从0到232-1。从C ++ 14 5.8 Shift运算符开始:  E1   在结果类型中。否则,如果E1具有带符号类型且非负值,并且E1×2E2在结果类型的相应无符号类型中可表示,则转换为结果类型的该值就是结果值;否则,行为是不确定的。
09-20 16:58