【问题标题】:Unsigned long long wrong given value after add添加后的无符号长长错误给定值
【发布时间】:2015-11-25 18:44:28
【问题描述】:

我有两个字符串要添加。字符串是 HEX 值。我将字符串转换为 long long,添加并在我返回字符串之后。但是这个操作不好用。

代码:

unsigned long long FirstNum = std::strtoull(FirstString.c_str(), NULL, 16);
unsigned long long SecondNum = std::strtoull(SecondString.c_str(), NULL, 16);
unsigned long long Num = FirstNum + SecondNum;
std::cout << "  " << FirstNum << "\n+ " << SecondNum << "\n= " << Num << "\n\n";

我收到了

  13285923899203179534
+ 8063907133566997305
= 2903086959060625223

谁能给我解释一下这个魔法?我该如何解决?

返回十六进制值

std::stringstream Stream;
Stream << std::hex << Num;
return Stream.str();

【问题讨论】:

  • 这里有一个简单的溢出案例。这些数字不适合 64 位整数。
  • @SergeyA 好的。我认为这是我的错误。谢谢。

标签: c++ add unsigned-long-long-int long-long


【解决方案1】:

C(和 C++)中的所有无符号算术都对某个 k 进行模 2k。在您的情况下,您将得到模 264 的结果,这意味着 unsigned long long 在您的平台上是 64 位。

如果您想对大于平台上支持的最大类型的整数进行算术运算,则需要使用多精度库,例如 GMP

【讨论】:

  • 谢谢克里斯。我认为这是我的错误。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多