long long int n = 2000*2000*2000*2000; // overflow
long long int n = pow(2000,4); // works
long long int n = 16000000000000; // works
最初のオーバーフロー (整数リテラル定数を乗算して long long に割り当てる) が発生するのはなぜですか?
2 番目や 3 番目のものと比べて何が違うのでしょうか?
ベストアンサー1
は、通常 32 ビットの であるため2000
です。 を使用してください。int
2000LL
LL
の代わりにサフィックスを使うことはll
、@AdrianMoleがコメントで提案したものですが、現在は削除されています。彼のコメントを確認してください。答え。
デフォルトでは、整数リテラルは、その値を保持できる最小の型ですが、それより小さくはありません。標準では実質的に少なくとも 16 ビットの型であることが保証されているため、int に簡単に格納できますint
。2000
算術演算子は常に、存在する型のうち大きい方で呼び出されますが、それより小さい型では呼び出されませんint
。
char*char
昇進するoperator*(int,int)->int
char*int
通話operator*(int,int)->int
long*int
通話operator*(long,long)->long
int*int
まだ電話がかかってきますoperator*(int,int)->int
。
重要なのは、型は結果を推論された型に格納できるかどうかに依存しないことです。これがまさにあなたのケースで発生している問題です。乗算はint
s で行われますが、結果は として格納されているためオーバーフローしますint
。
C++ は Haskell のように宛先に基づいて型を推論することをサポートしていないため、割り当ては無関係です。