質問
a
と b
の両方がタイプ int
であり、 b
がゼロ以外であるとします。次の場合に a / b
を実行した結果を考慮してください。
-
a
とb
は両方とも負ではありません。 -
a
とb
は両方とも負です。 - そのうちの1つが負です。
ケース1では、結果は最も近い整数に切り捨てられます。しかし、規格はケース2と3について何と言っていますか?インターネットに浮かぶ古いドラフトは、実装に依存していることを示しています(はい、ケース2でも)が、委員会は常に「ゼロに丸める」ことに傾いています。誰もが(最新の)標準が何を言っているか知っていますか?意味をなすものや特定のコンパイラが行うことではなく、標準に基づいてのみ回答してください。
解決
2008年5月の改訂によると、
その通りです:
二項/演算子は商を返し、二項%演算子は最初の式を2番目の式で除算した剰余を返します。 /または%の第2オペランドがゼロの場合、動作は未定義です。それ以外の場合、(a / b)* b + a%bはaと等しくなります。両方のオペランドが負でない場合、剰余は負ではありません。そうでない場合、残りの符号は実装定義です75)。
注75のコメント:
ISO Cの改訂に向けて進行中の作業によれば、整数除算の優先アルゴリズムは、ISO Fortran規格ISO / IEC 1539:1991で定義された規則に従います。この規則では、商は常にゼロに丸められます。
この点で、C ++がCに遅れをとることがあります。現状では定義されていませんが、彼らはそれを変えることに目を向けています。
私はStroustrupと同じ部門で、委員会のメンバーと一緒に働いています。物事を成し遂げるにはAGESが必要であり、果てしなく政治的です。ばかげていると思われる場合は、おそらくそうです。
他のヒント
他の回答の更新として:
C ++ 11の最後のドラフト、 n3242 これは、実際のC ++ 11標準と最も実用的な目的で同一であると、5.6のポイント4(118ページ)で述べています。
整数オペランドの場合、/演算子は代数商を生成します 端数部分は破棄されます。 (注80を参照)
注80の状態(注は非規範的であることに注意):
80)これは、しばしばゼロへの切り捨てと呼ばれます。
ポイント4は次の状態になります:
結果の型で商a / bを表現できる場合、 (a / b)* b + a%bはaと等しい。
a%b
の符号が a
の符号と同じであることを要求することが示されます(ゼロでない場合)。
時には一歩後退して、その数学だけを見る必要がある場合があります:
int x、int yの場合
if int i1 = x / yおよび int i2 = x%y
then y * i1 + i2はxでなければなりません
したがって、これは標準に関するものではありませんが、可能性のある方法は1つしかありません。標準が他の方法を許可している場合、その標準は間違っています。つまり、言語が壊れています。