C++:存储13位数字总是失败
C++ : storing a 13 digit number always fails
我正在用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);
您的数字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' ;
}
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 如果没有malloc,链表实现将失败
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 视图中的参数推导失败:take_while
- 如何用数字处理log(0)
- 链接到自行创建的dll失败
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 运行时检查失败 #2 - 变量"数字选择"周围的堆栈已损坏
- 由于程序停止工作,生成大量数字失败
- CIN >> 在较大的数字下失败,但对较小的数字有效?
- C++,将输入字符串转换为数字,转换失败不应返回零
- 添加大数字C++-初始化程序失败
- 检查数字是否为NaN失败
- 代码失败在向量的数据之前插入数字
- C++:存储13位数字总是失败
- 从文本文件读取数字矩阵(不包括方括号中的数据)到CPLEX IloNumArray2失败