質問

a b の両方がタイプ int であり、 b がゼロ以外であるとします。次の場合に a / b を実行した結果を考慮してください。

  1. a b は両方とも負ではありません。
  2. a b は両方とも負です。
  3. そのうちの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 の符号と同じであることを要求することが示されます(ゼロでない場合)。

コメントのみ。 C ++標準の現在の作業ドラフトは、「実装定義」を実際に修正しています。ゼロに向かって切り捨てを要求します。 こちらは委員会のウェブページで、こちらはドラフトです。問題は112ページにあります。

時には一歩後退して、その数学だけを見る必要がある場合があります:

int x、int yの場合

if int i1 = x / yおよび    int i2 = x%y

then y * i1 + i2はxでなければなりません

したがって、これは標準に関するものではありませんが、可能性のある方法は1つしかありません。標準が他の方法を許可している場合、その標準は間違っています。つまり、言語が壊れています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top