- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 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 中,您可以简单地使用 stoul
或 stoull
:
unsigned long long const barcode = std::stoull(barcode_s);
关于C++ : storing a 13 digit number always fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26326434/
我是一名优秀的程序员,十分优秀!