gpt4 book ai didi

C++ : storing a 13 digit number always fails

转载 作者:太空宇宙 更新时间:2023-11-04 16:12:53 25 4
gpt4 key购买 nike

我正在用 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);

关于C++ : storing a 13 digit number always fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26326434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com