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

时间:2014-10-12 14:55:33

标签: c++ types numbers

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

每当我尝试打印数字(包含在变量中)时,它会给我一个错误的结果(不是那个数字)。

32位类型不够,因为2 ^ 32是10位数字,我必须存储13位数字。但是对于64位,您可以重新呈现具有20位数的数字。所以我尝试使用" uint64_t"但这对我没有用,我真的不明白为什么。

所以我在互联网上搜索了哪个类型足以让我的变量适合。我在这个论坛上看到有相同问题的人但是他们使用long long int或long double作为类型来解决它。但没有一个对我有效(也没有长时间漂浮)。

我真的不知道哪种类型可以存储这个号码,因为我尝试了很多,但没有任何方法可以帮助我。

感谢您的帮助! :)

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

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

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

所以我认为这个问题来自&#34; atoi&#34;功能

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

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

但有几种解决方案。在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);

答案 1 :(得分:1)

你的号码9 780 321 563 842是十六进制8E52897B4C2,它符合44位(每个十六进制数位4位),因此任何64位整数,无论​​是有符号还是无符号,都有空余。 &#39; uint64_t中&#39;会起作用,甚至可以融入“双重”没有精度损失。

接下来,剩下的问题是你的代码中的一个错误,通常是64位数字意外转换到某个地方的另一个类型,或者你正在调用错误的错误来打印64位整数。

编辑:刚看到你的代码。 &#39;的atoi&#39;返回int。和&#39; int32_t&#39;一样。将其转换为&#39; unit64_t&#39;不会重建64位数。看看这个:http://msdn.microsoft.com/en-us/library/czcad93k.aspx

答案 2 :(得分:0)

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' ;
   }