【问题标题】:Multiplication of large numbers yields wrong value大数的乘法产生错误的值
【发布时间】:2018-06-02 21:05:09
【问题描述】:

我有密码

long long x = 200000 * 200000;
cout << x << endl;

它输出 1345294336 我试过转换为字符串并输出每个数字,它仍然输出相同的东西

【问题讨论】:

  • 您想查看您选择的机器的numeric limits。数据类型不能包含人为的大数字。一旦达到该限制,您的号码就会溢出。
  • 1345294336(又名0x502F9000)恰好是40000000000(又名0x9502F9000)的低32位,

标签: c++ integer-overflow long-long


【解决方案1】:

试试

long long x = 200000LL * 200000LL; 
std::cout << x << std::endl;

注意“LL”后缀。要详细了解如何为数字文字使用后缀,请访问 cppreference.com 上的 Integer Literals 页面。

【讨论】:

  • a=200000 b=200000 我想输出 a*b
  • 然后使用static_cast&lt;long long&gt;(a) * static_cast&lt;long long&gt;(b)(如果它们的类型还不够大)。
  • @AlexanderYang:您在 StackOverflow 上所做的不是在评论中说“它有效”,而是接受答案。如果你觉得它有用,你也可以点赞(有时这不是一回事)。
  • 你必须同时转换两个值吗?另一个应该被提升为long long
  • @Yksisarvinen:一个就足够了,但是只选择一个会引入不对称性,这会让读者有些困惑。这是根据Principle of Least Astonishment
猜你喜欢
  • 2013-07-16
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多