【发布时间】:2012-09-12 21:39:06
【问题描述】:
我在c++下编程时遇到了一件奇怪的事情。这是一个简单的乘法。
代码:
unsigned __int64 a1 = 255*256*256*256;
unsigned __int64 a2= 255 << 24; // same as the above
cerr()<<"a1 is:"<<a1;
cerr()<<"a2 is:"<<a2;
有趣的是,结果是:
a1 is: 18446744073692774400
a2 is: 18446744073692774400
而它应该是:(使用计算器确认)
4278190080
谁能告诉我这怎么可能?
【问题讨论】:
-
不明白为什么这获得了 8 票...
-
@H2CO3:因为它是一个“非常有趣的非显而易见的语言怪癖”,而不是因为这个问题得到了很好的表述或研究......
-
@H2CO3:是的,我们永远不要用我们 110% 不懂的语言编写任何代码。您确实意识到,不是吗,如果我们采取这种心态,我们将永远不会学到任何新东西?
-
关于 C++ 编译器的一个恼人的事情是,在不打开警告的情况下使用它们会让你犯大量你不应该犯的错误。当我在 GCC 中使用
g++ -Wall -Wextra -pedantic编译这段代码时,编译器非常清楚地告诉我:“警告:表达式 [-Woverflow] 中的整数溢出”。 Microsoft Visual Studio 也诊断出这个问题:“警告 C4307: '*' : 积分常数溢出”。我希望这可以作为将来编译警告的教训。 -
@DanielFischer:因此“取决于您的编译器”,因为每个人仍在忙于实施当前标准。
unsigned long long不在 C++03 中,因此要使用它,您需要 C++03 的特定于编译器的扩展或(暂时)C++11 的特定于编译器的部分实现。实际上每个人都有long long。
标签: c++ multiplication uint64