37

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

  1. aでありb、両方とも非負です。
  2. aでありb、どちらもマイナスです。
  3. そのうちの 1 つだけが否定的です。

ケース 1 では、結果は最も近い整数に切り捨てられます。しかし、規格はケース 2 とケース 3 について何と言っているでしょうか? 私がインターネット上に浮かんでいるのを見つけた古いドラフトは、それが実装に依存していることを示しています (そうです、ケース 2 でさえも) が、委員会はそれを常に「ゼロに向かって丸める」ことに傾いています。(最新の)標準が何を言っているか知っている人はいますか?意味のあることや特定のコンパイラの機能ではなく、標準に基づいてのみ回答してください。

4

4 に答える 4

26

2008年5月改訂によると、

あなたが正しい:

二項 / 演算子は商を生成し、二項 % 演算子は最初の式を 2 番目の式で割った剰余を生成します。/ または % の 2 番目のオペランドがゼロの場合、動作は未定義です。それ以外の場合、(a/b)*b + a%b は a に等しくなります。両方のオペランドが負でない場合、残りは負ではありません。そうでない場合、剰余の符号は実装定義です 75)。

注 75 は次のように述べています。

ISO C の改訂に向けて進行中の作業によると、整数除算の優先アルゴリズムは、ISO Fortran 標準、ISO/IEC 1539:1991 で定義された規則に従います。この規則では、商は常にゼロに向かって丸められます。

この点で C++ は C に遅れをとっている可能性があります。現状では、それは未定義ですが、彼らはそれを変更することに目を向けています。

私はストロストラップと同じ部署で、委員会のメンバーと一緒に働いています。物事を成し遂げるにはAGESが必要であり、それは際限なく政治的です。ばかげていると思われる場合は、おそらくそうです。

于 2008-11-26T06:24:00.417 に答える
26

他の回答の更新として:

C++11 の最後のドラフトであるn3242は、ほとんどの実用的な目的で実際の C++11 標準と同一であり、5.6 ポイント 4 (118 ページ) で次のように述べています。

整数オペランドの場合、/ 演算子は、小数部分を破棄して代数商を生成します。(注 80 を参照)

注 80 には次のように記載されています (注は規範的ではないことに注意してください)。

80) これはしばしばゼロ方向への切り捨てと呼ばれます。

ポイント 4 は次のように述べています。

商 a/b が結果の型で表現できる場合、(a/b)*b + a%b は a に等しくなります。

これは、 の符号が(ゼロでない場合)a%bの符号と同じである必要があることを示すことができます。a

于 2011-11-15T14:08:41.597 に答える
9

ただのコメント。C++ 標準の現在のワーキング ドラフトは、実際に「実装定義」の問題を修正し、ゼロに向けての切り捨てを求めています。ここに委員会のウェブページがあり、ここにドラフトがあります。問題は 112 ページにあります。

于 2008-11-26T06:35:18.040 に答える