261

例えば、

int result;

result = 125/100;

また

result = 43/100;

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

4

6 に答える 6

214

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

そうではありません。フローリングではなく、0 に向かって丸めます。

6.5.5 乗法演算子

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

および対応する脚注:

  1. これは、「ゼロ方向への切り捨て」と呼ばれることがよくあります。

もちろん、注意すべき点は次の 2 つです。

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

と:

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

[注:私の強調]

于 2010-08-30T17:44:23.500 に答える
48

Dirkgently はC99 での整数除算の優れた説明を提供しますが、C89 では、負のオペランドを使用した整数除算には実装定義の方向があることも知っておく必要があります。

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

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

したがって、C89 コンパイラで行き詰まっている場合は、負の数に注意してください。

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

于 2010-08-30T23:28:06.453 に答える
28

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

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

符号なしおよび負でない符号付きの値の場合、これはフロアと同じです (-Infinity に向かって丸められます)。

于 2010-08-30T17:42:55.303 に答える
25

結果が負の場合、C はフロアではなく 0 に向かって切り捨てます - なぜ Python の整数除算が常にここでフロアになるのかについて、この読み物を学びました: Why Python's Integer Division Floors

于 2010-08-30T17:55:17.943 に答える
13

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

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

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

明確にするために、整数除算はゼロに向かって丸めます (切り捨てます)。

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

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
于 2015-02-06T07:42:30.997 に答える