-1

stringstreamを使用して文字列をintに変換しようとしていますが、以下のコードは機能しますが、12345678901のように1234567890を超える数値を使用すると、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億をわずかに超えています。(ユビキタス32ビットintを想定)

それはintに収まりません!

于 2012-07-25T22:06:53.880 に答える
2

(32ビットプラットフォームでの)最大のunsignedintは2^ 32(4294967296)であり、入力がそれよりも大きいため、あきらめています。どういうわけか、そこからエラーコードを取得できると思います。多分チェックfailbitまたはbadbit

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ビットまたはLP6464ビットシステムを使用している場合、intは32ビットであるため、格納できる最大数は約20億です。代わりにlongまたはlonglongを使用してみて、「%d」を「%ld」または「%lld」に適切に変更してください。

于 2012-07-25T22:09:00.603 に答える
1

符号付き整数の(通常の)最大値は、(通常は)32ビット整数であるため2.147.483.647であるため、それより大きい数値では失敗します。

に置き換えると、さらに大きな数でも機能int Result;するlong Result;はずですが、それでも制限があります。整数型を使用すると、その制限を2倍に拡張できますがunsigned、負の数が必要ない場合に限ります。

于 2012-07-25T22:09:05.753 に答える
0

うーん、既存の4つまたは5つの答えに多くの偽情報があります。

Anintは最小16ビットであり、一般的なデスクトップシステムコンパイラでは通常32ビット(すべてのWindowsバージョン)または64ビットです。32ビットの場合、最大2 32の異なる値があり、K = 2 10 = 1024に設定すると、4・K 3、つまり約40億になります。最寄りの電卓またはPythonプロンプトで、正確な値を知ることができます。

Alongは最小32ビットですが、64ビットWindowsを含むすべての現存するWindowsバリアントでは32ビットであるため、現在の問題には役立ちませんlong

したがって、よりも範囲を広げるにはint、を使用しますlong long。最小64ビットであり、実際には、2012年の時点ですべてのコンパイラで64ビットです。または、double整数型ではありませんが、最も一般的な実装(IEEE 754 64ビット)で整数値を正確に表すことができる、を使用するだけです。覚えているように、約51ビットまたは52ビットです。正確に知りたい場合は調べてください。ビット数。

とにかく、変換の失敗についてストリームをチェックするs.fail()ことを忘れないでください。これは、または単純に行うことができます!s(これはfail()、より正確には、ストリームの戻り値への明示的な変換に相当しboolます!fail())。

于 2012-07-25T22:26:33.027 に答える