C++:存储13位数字总是失败

C++ : storing a 13 digit number always fails

本文关键字:失败 数字 13位 存储 C++      更新时间:2023-10-16

我正在用C++编程,我必须在我的一个练习器中存储大数字。我要存储的最大数字是:9 780 321 563 842。

每次我试图打印(包含在变量中的)数字时,都会得到错误的结果(而不是那个数字)。

32位类型是不够的,因为2^32是一个10位数的数字,我必须存储一个13位数的数字。但是有了64位,你可以重新发送一个有20位的数字。所以我尝试使用类型"uint64_t",但这对我不起作用,我真的不明白为什么。

所以我在互联网上搜索,找到哪种类型足以让我的变量适应。我在这个论坛上看到有人有同样的问题,但他们使用long-long-int或long-double作为类型来解决。但没有一个对我有效(long float也没有)。

我真的不知道哪种类型可以存储这个号码,因为我尝试了很多,但都不起作用

谢谢你的帮助!:)

--编辑:代码有点长和复杂,对这个问题来说无关紧要,所以这实际上是我对包含该数字的变量所做的:

string barcode_s = "9780321563842";
uint64_t barcode = atoi(barcode_s.c_str()); 
cout << "Barcode is : " << barcode << endl;

当然,我不会把这个数字放在变量(字符串类型)"barcode_s"中直接转换成数字,但这就是我的程序中发生的事情。我从输入文件中读取文本,并将其放入"barcode_s"中(我读取并放入该变量中的文本始终是一个数字),然后我将该字符串转换为数字(使用atoi)。

所以我认为问题来自"atoi"函数?

谢谢你的帮助!

问题实际上是atoi:它返回一个int,在大多数平台上是32位整数。从int转换为uint64_t不会神奇地恢复丢失的信息。

不过,有几种解决方案。在C++03中,您可以使用stringstream来处理转换:

std::istringstream stream(barcode_s);
unsigned long barcode = 0;
if (not (stream >> barcode)) { std::abort(); }

在C++11中,您可以简单地使用stoulstoull:

unsigned long long const barcode = std::stoull(barcode_s);

您的数字9 780 321 563 842是十六进制8E5897B4C2,可容纳44位(每个十六进制数字4位),因此任何64位整数,无论是有符号的还是无符号的,都有多余的空间。'uint64_t"将起作用,它甚至可以在不损失精度的情况下放入"double"。

因此,剩下的问题是代码中的一个错误,通常是64位数字意外转换为其他类型,或者您调用了错误的操作来打印64位整数。

编辑:刚刚看到你的代码atoi'返回int.As在'int32_t'中。将其转换为"unit64_t"将不会重建64位数字。看看这个:http://msdn.microsoft.com/en-us/library/czcad93k.aspx

atoll()函数将char*转换为long-long。

如果你没有更长的功能,请同时编写自己的功能。

   uint64_t result = 0 ;
   for (unsigned int ii = 0 ; str.c_str()[ii] != 0 ; ++ ii)
   {
      result *= 10 ;
      result += str.c_str () [ii] - '0' ;
   }