C++ 左换档时出现一些意外行为<&书信电报;

C++ 左换档时出现一些意外行为<&书信电报;,c++,visual-c++,visual-c++-2013,C++,Visual C++,Visual C++ 2013,这是当前在Windows 10上运行的32位MFC应用程序。用Visual C++ 2013编写。 std::cout << "sizeof(long long) = " << sizeof(long long) << std::endl; int rot{ 32 }; long long bits{ (1 << rot) }; std::cout << "bits with variable = " << bits &l

这是当前在Windows 10上运行的32位MFC应用程序。用Visual C++ 2013编写。
std::cout << "sizeof(long long) = " << sizeof(long long) << std::endl;

int rot{ 32 };
long long bits{ (1 << rot) };
std::cout << "bits with variable = " << bits << std::endl;

long long bits2 = (1 << 32);
std::cout << "bits2 with constant = " << bits2 << std::endl;

system("pause");
以下是发布版本的输出:

sizeof(long long) = 8
bits with variable = 0
bits2 with constant = 0
Press any key to continue . . .

所以,很明显,即使使用64位数据类型,我的单个位也被左移到了遗忘状态。但我真的很困惑,如果我使用变量作为参数与常量进行移位,为什么调试构建会产生不同的输出?

对于64位,您需要
long
类型


表达式
1对于64位,您需要
long
类型


表达式
1表达式
1表达式
1@Bathsheba:但是:
(1哦,天哪,你说得对,我现在回想了这么多年前摄氏度和华氏度之间的转换…:D@NathanOliver:UB.一个由编译器计算,另一个在runtime.BTW;clang和gcc都将发出“移位计数大于类型宽度”的警告,但VC++2013没有。@Bathsheba:但两者之间的区别何在:
(1哦,天哪,你说得对,多年前我就在倒叙摄氏度和华氏度之间的转换…:D@NathanOliver:UB.一个由编译器计算,另一个在runtime.BTW;clang和gcc都会对“移位计数大于类型的宽度",但VC++2013没有。这不是问题所在,但您真的需要
std::endl
所做的额外工作吗?
'\n'
结束了一行。这是编写嵌入式代码的一种反射,在您调查的任何崩溃或挂起发生之前,经常刷新输出缓冲区会让日志消息通过。当然,这是一种反射这里是多余的。谢谢提醒!这不是问题所在,但您真的需要
std::endl
所做的额外工作吗?
'\n'
结束一行。这是编写嵌入式代码的一种反射,在您正在调查的任何崩溃或挂起发生之前,经常刷新输出缓冲区是让日志消息通过的。B不过这当然是多余的。谢谢你的提醒!
sizeof(long long) = 8
bits with variable = 0
bits2 with constant = 0
Press any key to continue . . .