long long n = 2000*2000*2000*2000; がオーバーフローするのはなぜですか? 質問する

long long n = 2000*2000*2000*2000; がオーバーフローするのはなぜですか? 質問する
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です。 を使用してください。int2000LL

LLの代わりにサフィックスを使うことはll、@AdrianMoleがコメントで提案したものですが、現在は削除されています。彼のコメントを確認してください。答え

デフォルトでは、整数リテラルは、その値を保持できる最小の型ですが、それより小さくはありません。標準では実質的に少なくとも 16 ビットの型であることが保証されているため、int に簡単に格納できますint2000

算術演算子は常に、存在する型のうち大きい方で呼び出されますが、それより小さい型では呼び出されません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

重要なのは、型は結果を推論された型に格納できるかどうかに依存しないことです。これがまさにあなたのケースで発生している問題です。乗算はints で行われますが、結果は として格納されているためオーバーフローしますint

C++ は Haskell のように宛先に基づいて型を推論することをサポートしていないため、割り当ては無関係です。

おすすめ記事