我用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;功能
感谢您的帮助!
答案 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中,您只需使用stoul
或stoull
:
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' ;
}