将字符串转换为int失败

时间:2012-07-25 22:04:36

标签: c++

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

5 个答案:

答案 0 :(得分:2)

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

它只是不适合int!

答案 1 :(得分: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";
}

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

嗯,在现有的四到五个答案中有很多错误信息

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

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

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

无论如何,请记得检查转化失败的流,您可以s.fail()!s执行此操作(相当于fail(),更多确切地说,流明确转换为bool会返回!fail())。