B を A で除算する最も安全な方法は次のとおりです。
unsigned long long A;
unsigned long int B;
私はすでにそれを行うために次の行を使用しています。正常に動作しますが、セグメンテーション違反で失敗することがあります。
double C;
C= double(B)/double(A);
ありがとう
(まず、unsigned long int
は と同じですunsigned long
)
データ型昇格規則は、 を評価するときにA / B
、B
が昇格されunsigned long long
、除算が整数演算で実行されることを意味します。つまり、残りは失われます。
or B
いずれかの Aをキャストするdouble
と、演算が浮動小数点で実行されますdouble
。(ただし、long long
型を にキャストするとdouble
、精度が失われる可能性があることに注意してください。)
セグメンテーション違反C = double(B) / double(A);
にはなりませんのでご安心ください。このステートメントの前に、メモリ破損/その他の未定義の動作が発生している必要があります。スタックを台無しにしたと思われます。
これらは int であるため、浮動小数点の小数の結果が実際に期待される場合を除き、double にキャストする必要はありません (つまり、おそらくキャストしたいのですが、それはあなたの過失とは関係ありません)。
ゼロ除算が原因でエラーが発生する可能性が高くなります。