- ベストアンサー
余りの演算子%について
C言語の質問です。 -2%10 の演算に対して 8 を期待していたのですが、 演算結果は、 -2 でした。 -2 を 8 にする演算は、存在しないんでしょうか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
-2を10で割った商と余りが ・商=0、余り=-2 ・商=-1、余り=8 のいずれになるかは処理系依存だそうです。
その他の回答 (8)
- jacta
- ベストアンサー率26% (845/3158)
符号が異なるオペランドの剰余算の結果が処理系定義(未定義ではない)になるのはC99より前の規格です。C++でも処理系定義になります。 そうした処理系では、処理系に依存しない結果を得るためにはdivまたはldiv関数を使う必要がありました。 C99で結果が処理系定義なくなったのは、-2 % 10 の結果が8になるような処理系が実質的になくなったからだと思います。
- Werner
- ベストアンサー率53% (395/735)
ANo.2の参考リンクに書いてある通りなら、 C89なら未定義(処理系依存)で C99だと剰余の符号は被除数(Dividend)と同じになります。 この剰余の符号については特にどちらが一般的ということもないと思います。 (というか剰余に負が絡むこと自体が一般的でないかも。) 個人的にはrubyの様にDivisorと符号が一致する方が好きですけどね。
- asuncion
- ベストアンサー率33% (2127/6289)
私の仮説を補強してくださってありがとうございます。>sakusaker7さん
- asuncion
- ベストアンサー率33% (2127/6289)
> If not, it is guranteed only that the absolute value of the > remainder is smaller than the absolute value of the divisor. もし、%演算におけるオペランドのうち少なくとも一方が負の場合は、 剰余の絶対値が割る数の絶対値よりも小さいことだけを保証している。 というわけですから、 > -2を10で割った商と余りが > ・商=0、余り=-2 > ・商=-1、余り=8 > のいずれになるかは処理系依存だそうです。 は成立すると思います。
- titokani
- ベストアンサー率19% (341/1726)
なんも、 m=-2%10; if( m < 0 )m+=10; でいいんじゃないでしょうか。
- sakusaker7
- ベストアンサー率62% (800/1280)
処理系依存なのはANSI以前の話です。 the % operator the remainder, of the division of the first operand by second; (略) If both operands are non-negative, then (略) If not, it is guranteed only that the absolute value of the remainder is smaller than the absolute value of the divisor. とK&R(2nd ed.)にもあります(205ページ)。 JISとかでも探せば同様の記述があるでしょう。
- sakusaker7
- ベストアンサー率62% (800/1280)
>-2 を 8 にする演算は、存在しないんでしょうか? Cでそのような動きをする演算子があるかということならありません。 他の言語も含め、そのような演算を行うものがあるかということならあります。 Modulo operation - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/Modulo_operation
お礼
すみません。変な言葉使ってしまいましたね。
- Dxak
- ベストアンサー率34% (510/1465)
普通に考えて・・・ -2 / 10 = 0 … -2 が正解で -2 / 10 = -1 … 8 と、言うのは、不自然では無いでしょうか? ですので、その辺りは、演算子で!と言うのは無理があると思うのですが・・・ あとは、If文で割り算結果で、繰上げ、余りを計算させる結果だと思います
補足
余りは、0以上になるのが一般的なのでは?
お礼
なるほど・・・。商=-1、余り=8になってくれればよかったんですけどね・・・。残念です。 ありがとうございます。