の二乗を求めようとしていますint
。私のコードは以下のようになります:
long long sqr=0;
int num=77778;
sqr= num*num;
結果はだったはずですが6049417284
、出力を確認すると1754449988
. 私がしている間違いは何ですか?
long long
結果を保存できるはずですが、なぜ別の値が得られるのでしょうか?
の二乗を求めようとしていますint
。私のコードは以下のようになります:
long long sqr=0;
int num=77778;
sqr= num*num;
結果はだったはずですが6049417284
、出力を確認すると1754449988
. 私がしている間違いは何ですか?
long long
結果を保存できるはずですが、なぜ別の値が得られるのでしょうか?
この場合、中間結果の型は最初の引数の型と同じです。したがって、このコードは間違った値を入れますsqr
(ここでは整数オーバーフローがあるため)。これを試して:
long long num = 77778;
long long sqr = num * num;
キャストの別の方法:
int num = 77778;
long long sqr = (long long) num * num;
よりよく理解するために、次の行を確認できます。
int ia = 1, ib = 2;
double da = 1.0, db = 2.0;
double ic = ia / ib; // c == 0.0, because intermediate result of division is 0
double dc = da / db; // c == 0.5, expected result
2 つの整数値を乗算すると、結果は整数値になります。その場合、long long に整数値を代入しても意味がありません。
したがって、目的の結果を得るには、num も long long にする必要があります。