4

C++03 の $5.6/4 は次のように述べています

Note 74 は

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

C++0x の状態 -

$5.6/4- "整数オペランドの場合、/ 演算子は、小数部分を破棄した代数商を生成します。商 a/b が結果の型で表現できる場合、79(a/b)*b + a%bは aに等しくなります。

注79は言う

これは、多くの場合、ゼロへの切り捨てと呼ばれます。

だから私は2つの質問があります:

  • 誰かがこの「ゼロへの切り捨て」の概念を説明できますか?

  • 負のオペランドを持つモジュラスは C++0x で定義された動作ですか?

4

3 に答える 3

6

ゼロへの切り捨てとは、ゼロに最も近い次の整数を選択して実数を整数に変換することを意味します。同様に、数値を書き留め、数値が正か負かに関係なく、小数点以下のすべてを無視します。

11/4 = 2.75を考えてみましょう。これをゼロに向かって切り捨てると、2になります。

-11/4または11/-4 = -2.75-を検討してください。これをゼロに向かって切り捨てると、-2になります。

一部の数学演算では、(a / b)* b + a%b==aであることが重要です。この方程式を成り立たせる必要があり、整数除算がゼロに向かって切り捨てられることも受け入れる場合、%次のように演算子の演算を推測できます。

a == 11, b == 4:
a/b == 2, 2*4 + a%b == 11, therefore a%b == 3.

a == -11, b == 4:
a/b == -2, -2 * 4 + a%b == -11, therefore a%b == -3.

a == 11, b == -4:
a/b == -2, -2 * -4 + a%b == 11, therefore a%b == 3.

a == -11, b == -4:
a/b == 2, 2 * -4 + a%b == -11, therefore a%b == -3.

最初は混乱するかもしれませんが、C ++ 0xはa%b、方程式を使用して演算子の動作を定義しています(a/b)*b + a%b == a。この方程式は負の数にも当てはまるので、負の数に対してa%b定義されます。

于 2010-08-29T14:03:03.117 に答える
3

a) を考慮してください(±5)/(±3) -> ±1。数直線上:

  (-5)/3                                     5/3
     5/(-3)                               (-5)/(-3)
      =                                       =
    -1.66 --> -1                       1 <-- 1.66
       v       v                       v       v
-  +  -  -  -  +  -  -  -  +  -  -  -  +  -  -  -  +  -
   |           |           |           |           |
  -2          -1           0           1           2

したがって、丸めはゼロに向かって行われます。

b) はい。はすべてのand ( を除く)とa/bに対して定義されているため、には一意の解が 1 つしかないため、演算子もすべてのand (を除く) に対して十分に定義されています。abb == 0(a/b)*b + a%b == aa%b%abb == 0

于 2010-08-29T14:02:12.170 に答える
1

a) 「ゼロ方向への切り捨て」とは、小数部分が切り捨てられることを意味します。切り捨てられた数値は常に元の数値と少なくとも同じくらい 0 に近く、通常は元の数値よりも近くなります。

これは負の数で最も顕著ですが、目標は負の数での使用/%簡単にすることです (現在、どの実装でも選択した方法で処理できるため)。-7/4 は 2 つの方法で考えることができます: -2 余り 1、または -1 余り -3。そして、それを両方の方法で処理するコンパイラとプロセッサがあります。-7/4 は実際には -1.75 であるため、「ゼロ方向への切り捨て」は -1 になるため、後者の方法が標準になります。

b) こんな感じです。それは常に準定義 (「実装定義」) でしたが、これは最初から標準であるべきものを定義しようとする試みのように見えます。

于 2010-08-29T14:00:55.960 に答える