- ベストアンサー
余りの演算子%について
- みんなの回答 (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% (2126/6288)
私の仮説を補強してくださってありがとうございます。>sakusaker7さん
- asuncion
- ベストアンサー率33% (2126/6288)
> 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以上になるのが一般的なのでは?
関連するQ&A
- 演算子(+=)について
演算子(+=)について C言語のプログラム中に(1)の文が存在するのですが、(2)の文と同じ意味でよろしいでしょうか? a+=8; ・・・(1) a=a+8; ・・・(2) 教授下さい。 よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- 剰余演算を論理演算と加減算に置き換える方法
剰余(割算の余り)を求める演算を論理演算と加減算とビットシフトのみで行う方法がありましたら教えてください。 言語はC/C++ではなくても大丈夫です(ロジックだけでも)。
- ベストアンサー
- C・C++・C#
- C言語のビット演算子について
C言語のビット演算子に関する質問です。 ビット単位の演算とは、どのような場面で使用されているものなので しょうか? また、ビット単位の演算が行えることにどのようなメリットがあるの でしょうか? 基本的な質問で申し訳ございませんが、どなたかご回答頂けますか?
- ベストアンサー
- C・C++・C#
- 論理演算について質問
最初に、前回同じ質問に答えてくださった方へ、いろいろな人から僕の仮説のコンセンサスを得たいので、再度同じ質問しますね。 int a=1,b=0,c=0のとき a==1 && b==0 | (a==1 && b==0) a==1 && b==0 &&c==0 && b==0 の2つの論理式あったとします 質問1:&&や||は、その間にある2つの関係式や2つの関係式の論理演算の結果同士などを論理演算するものだと思います。この認識で正しいですか? 質問2:上記の論理式の後者a==1 && b==0 &&c==0 && b==0について、trueになるプロセスの認識は以下で正しいですか? a==1 && b==0 はtrue ↓ 左から2番目の&&は、左の論理式(a==1 && b==0)の演算結果であるtrueと関係式c==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、、結果true ↓ 左から3番目の&&は、左の論理式(a==1 && b==0 &&c==0 )の演算結果であるtrueと右の関係式b==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、結果true 質問3:前者の論理式、a==1 && b==0 | (a==1 && b==0)について、trueになるプロセスの認識は以下で正しいですか? (a==1 && b==0)はtrue ↓ a==1 && b==0 はtrue ↓ |は、右の論理式((a==1 && b==0))の演算の結果trueと左の論理式(a==1 && b==0)の演算結果trueを計算し(つまり論理演算の結果同士であるtrue2つを演算)、結果true
- ベストアンサー
- Java
- 論理演算について質問
int a=1,b=0,c=0のとき a==1 && b==0 || (a==1 && b==0) a==1 && b==0 &&c==0 && b==0 の2つの論理式あったとします 質問1:&&や||は、その間にある2つの関係式や2つの関係式の論理演算の結果同士などを論理演算するものだと思います。この認識で正しいですか? 質問2:上記の論理式の後者a==1 && b==0 &&c==0 && b==0について、trueになるプロセスの認識は以下で正しいですか? a==1 && b==0 はtrue ↓ 左から2番目の&&は、左の論理式(a==1 && b==0)の演算結果であるtrueと関係式c==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、、結果true ↓ 左から3番目の&&は、左の論理式(a==1 && b==0 &&c==0 )の演算結果であるtrueと右の関係式b==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、結果true 質問3:上記前者の論理式a==1 && b==0 || (a==1 && b==0)について、trueになるプロセスの認識は以下で正しいですか? (a==1 && b==0)はtrue ↓ a==1 && b==0 はtrue ↓ ||は、右の論理式((a==1 && b==0))の演算の結果trueと左の論理式(a==1 && b==0)の演算結果trueを計算し(つまり論理演算の結果同士であるtrue2つを演算)、結果true
- ベストアンサー
- Java
お礼
なるほど・・・。商=-1、余り=8になってくれればよかったんですけどね・・・。残念です。 ありがとうございます。