-1

我正在尝试使用 stringstream 将字符串转换为 int,下面的代码可以工作,但是如果我使用的数字超过1234567890,比如12345678901 ,那么它会返回0 ...我不知道如何解决这个问题,请帮助我出去

std:: string number= "1234567890";

int Result;//number which will contain the result

std::stringstream convert(number.c_str()); // stringstream used for the conversion initialized with the contents of Text

if ( !(convert >> Result) )//give the value to Result using the characters in the string
    Result = 0;

printf ("%d\n", Result);
4

5 回答 5

2

int 可以包含的最大数量略大于 20 亿。(假设 ubiquitios 32 位整数)

它只是不适合 int!

于 2012-07-25T22:06:53.880 回答
2

最大的 unsigned int (在 32 位平台上)是 2^32 (4294967296),并且您的输入比这大,所以它放弃了。我猜你可以以某种方式从中获取错误代码。也许检查failbitbadbit

int Result;
std::stringstream convert(number.c_str());
convert >> Result;
if(convert.fail()) {
    std::cout << "Bad things happened";
}
于 2012-07-25T22:07:39.793 回答
2

如果您使用的是 32 位或 LP64 64 位系统,则 int 是 32 位,因此您可以存储的最大数字约为 20 亿。尝试使用 long 或 long long,并将“%d”适当地更改为“%ld”或“%lld”。

于 2012-07-25T22:09:00.603 回答
1

有符号整数的(通常)最大值是 2.147.483.647,因为它(通常)是一个 32 位整数,因此对于更大的数字它会失败。

如果你用它替换int Result;long Result;应该适用于更大的数字,但仍然有一个限制。您可以使用unsigned整数类型将该限制扩大 2 倍,但前提是您不需要负数。

于 2012-07-25T22:09:05.753 回答
0

嗯,现有的四五个答案中有很多虚假信息。

Anint最小为 16 位,对于常见的桌面系统编译器,它通常是 32 位(在所有 Windows 版本中)或 64 位。对于 32 位,它最多有 2 32 个不同的值,设置 K=2 10 = 1024,是 4·K 3,即大约 40 亿。离您最近的计算器或 Python 提示符可以告诉您确切的值。

Along至少是 32 位,但这对您当前的问题没有帮助,因为在所有现存的 Windows 变体中,包括 64 位 Windows,long都是 32 位......

因此,要获得比 更好的范围int,请使用long long。它至少是 64 位,实际上,截至 2012 年,所有编译器都是 64 位。或者,只使用 a double,虽然不是整数类型,但最常见的实现(IEEE 754 64 位)可以精确地表示整数值,我记得大约 51 或 52 位 - 如果你想要准确的,请查看位数。

无论如何,请记住检查流是否有转换失败,您可以通过s.fail()或简单地执行此操作!s(更准确地说,这相当于fail()流的显式转换为bool返回!fail())。

于 2012-07-25T22:26:33.027 回答