1

int2 つの数値を乗算したいのですが、int制限 (2147483647) を超えないようにするために、結果はlong long変数に保存されます。だから、私はこのコードを試します:

int a, b;
long long result = a * b;

そしてそれはうまくいきません!もしa=50000b=50000そしてresult=-1794967296

したがって、型キャストをaandに適用する必要がありbます。

int a, b;
long long result = (long long)a * (long long)b;

この場合、型キャストを適用する必要があるのはなぜですか?

a注:とのデータ型を変更したくないので、bそのままにしておく必要がありますint

4

4 に答える 4

7

abはであるためint、彼らの製品a*bintです。しかし、積が大きすぎてオーバーフローし、誤った値が得られます。積もlong long.

ちなみに、両方のオペランドをキャストする必要はありません。1 つだけで十分です。

long long result = a * (long long)b;

もう一人も昇進long longこのオンライン デモを参照してください。

ちなみに、C スタイルのキャストよりも C++ スタイルのキャストをお勧めします。

long long result = a * static_cast<long long>(b);

それが役立つことを願っています。

于 2013-08-10T11:35:04.047 に答える
2

aと の両方をキャストする必要はありませんb。だけaで十分です。

あなたがコンパイラーであると考えてみてください。あなたは尋ねられcombineますplace

combineとの 2 つの命令ですplace。のような高速な言語を使用している場合は、2 番目のものは最初のものを気にする必要はありませんC

あなたを助けるのは、それがcombine何を組み合わせるかを気にすることです。これで、それを明確に記述し、オペランドの 1 つを にキャストするだけで済みますlong long

placeあなたはそれがもっと賢くなるかもしれないと思うかもしれませんし、実際にはもっと賢くなるはずですが、どれだけ賢くなるべきかについて明確に定義された制限もあるはずです。

于 2013-08-10T11:43:28.223 に答える