web-dev-qa-db-ja.com

整数除算の動作は何ですか?

例えば、

int result;

result = 125/100;

または

result = 43/100;

結果は常に部門のフロアになりますか?定義された動作は何ですか?

183
T.T.T.

結果は常に部門のフロアになりますか?定義された動作は何ですか?

はい、2つのオペランドの整数商です。

6.5.5乗法演算子

6整数が除算されると、/演算子の結果は、小数部分が切り捨てられた代数商になります。88) 商a/bが表現可能であれば、式(a/b)* b + a%bはaと等しくなります。

そして対応する脚注:

88)これはしばしば「ゼロに向かっての切り捨て」と呼ばれます。

もちろん注意すべき2つの点があります。

通常の算術変換はオペランドに対して実行されます。

そして:

5 /演算子の結果は、最初のオペランドを2番目のオペランドで除算した商です。 %演算子の結果は残りです。 どちらの演算でも、2番目のオペランドの値がゼロの場合、動作は未定義です

[注:私の強調点]

159
dirkgently

C99では 優秀な説明 整数除算を丁寧に与えていますが、C89では負のオペランドを使った整数除算は実装定義の方向を持つことも知っておくべきです。

ANSI Cドラフト(3.3.5)から:

いずれかのオペランドが負の場合、%演算子の結果の符号と同様に、/演算子の結果が代数商よりも小さい最大の整数であるか、代数商よりも大きい最小の整数であるかは実装定義です。商a/bが表現可能であれば、式(a/b)* b + a%bはaと等しくなります。

C89コンパイラを使い慣れている場合は、負の数に注意してください。

それはFORTRANがそれをした方法であったのでC99がゼロに向かって切り捨てを選んだのは楽しい事実です。 comp.std.cの このメッセージ を参照してください。

38
schot

結果が負の場合、Cはフロアリングではなく0に向かって切り捨てられます - Pythonの整数除算が常にここでフロアになる理由について、この記事を読みました。 なぜPythonの整数除算フロア

20
Gareth Williams

はい、結果は常にゼロに向かって切り捨てられます。絶対値の最小値に丸めます。

-5 / 2 = -2
 5 / 2 =  2

符号なしおよび負でない符号付き値の場合、これはfloorと同じです(-Infinityに丸める)。

18
Leonid

結果は常に部門のフロアになりますか?

いいえ。結果は異なりますが、負の値に対してのみ変動が発生します。

定義された動作は何ですか?

明確にするためには、負の無限大に向かってフロアラウンドを丸める一方で、整数除算はゼロに向かってラウンドする(切り捨て)

正の値の場合、それらは同じです

int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0

負の値ではこれは違います

int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
11