2016-04-04 9 views
2

私はcharをintに変換する小さなプログラムを書いています。プログラムは、フォーム'1234'の文字を読み込み、その後、出力INT 1234手作業でcharをintに変換する - 奇妙な振る舞い

#include <iostream> 
using namespace std; 

int main(){ 
    cout << "Enter a number with as many digits as you like: "; 
    char digit_char = cin.get(); // Read in the first char 
    int number = digit_char - '0'; 
    digit_char = cin.get(); // Read in the next number 
    while(digit_char != ' '){ // While there is another number 
     // Shift the number to the left one place, add new number 
     number = number * 10 + (digit_char - '0'); 
     digit_char = cin.get(); // Read the next number 
    } 
cout << "Number entered: " << number << endl; 
return 0; 
} 

これは小さな文字で正常に動作しますが、私は12345678901のように大きな文字(上記の長さ11とを)しようとすると、プログラムが間違っを返します結果、-539222987

何が起こっているのですか?

+3

整数オーバーフロー? – Laurel

+0

システム上の 'int'のサイズはどれくらいですか?' int'が保持できるシステム上の最大値は何ですか? –

+1

ヒント:intに格納できる最大の数字は何ですか? – alex

答えて

1

タイプintは、このような大きな数値を格納するのに十分ではありません。タイプintの代わりにunsigned long long intを使用してください。

指定された整数型で表現できる最大数を確認できます。例えば

#include <iostream> 
#include <limits> 

int main() 
{ 
    std::cout << std::numeric_limits<unsigned long long int>::max() << std::endl; 
} 

ためのCでは、バイナリの定数ヘッダに定義されULLONG_MAX<limits.h>

3

12345678901を使用することができる34ビットです。その結果、整数値がオーバーフローし、符号ビットが設定されました。

1

は、代わりにintを使用しての、あなたの変数ためunsigned long long intを使用するようにしてください。 それはあなたの問題を解決するはずです。

0

オーバーフローした整数。 unsigned long long intを使用してください。