• ベストアンサー

余りの演算子%について

C言語の質問です。 -2%10  の演算に対して 8 を期待していたのですが、 演算結果は、 -2 でした。 -2 を 8 にする演算は、存在しないんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

-2を10で割った商と余りが  ・商=0、余り=-2  ・商=-1、余り=8 のいずれになるかは処理系依存だそうです。

red13x3
質問者

お礼

なるほど・・・。商=-1、余り=8になってくれればよかったんですけどね・・・。残念です。 ありがとうございます。

その他の回答 (8)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.9

符号が異なるオペランドの剰余算の結果が処理系定義(未定義ではない)になるのはC99より前の規格です。C++でも処理系定義になります。 そうした処理系では、処理系に依存しない結果を得るためにはdivまたはldiv関数を使う必要がありました。 C99で結果が処理系定義なくなったのは、-2 % 10 の結果が8になるような処理系が実質的になくなったからだと思います。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.8

ANo.2の参考リンクに書いてある通りなら、 C89なら未定義(処理系依存)で C99だと剰余の符号は被除数(Dividend)と同じになります。 この剰余の符号については特にどちらが一般的ということもないと思います。 (というか剰余に負が絡むこと自体が一般的でないかも。) 個人的にはrubyの様にDivisorと符号が一致する方が好きですけどね。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.7

私の仮説を補強してくださってありがとうございます。>sakusaker7さん

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

> 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)
回答No.5

なんも、 m=-2%10; if( m < 0 )m+=10; でいいんじゃないでしょうか。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

処理系依存なのは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)
回答No.2

>-2 を 8 にする演算は、存在しないんでしょうか? Cでそのような動きをする演算子があるかということならありません。 他の言語も含め、そのような演算を行うものがあるかということならあります。 Modulo operation - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/Modulo_operation

red13x3
質問者

お礼

すみません。変な言葉使ってしまいましたね。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

普通に考えて・・・ -2 / 10 = 0 … -2 が正解で -2 / 10 = -1 … 8 と、言うのは、不自然では無いでしょうか? ですので、その辺りは、演算子で!と言うのは無理があると思うのですが・・・ あとは、If文で割り算結果で、繰上げ、余りを計算させる結果だと思います

red13x3
質問者

補足

余りは、0以上になるのが一般的なのでは?

関連するQ&A

  • 演算子(+=)について

    演算子(+=)について C言語のプログラム中に(1)の文が存在するのですが、(2)の文と同じ意味でよろしいでしょうか? a+=8; ・・・(1) a=a+8; ・・・(2) 教授下さい。 よろしくお願い致します。

  • 剰余演算を論理演算と加減算に置き換える方法

    剰余(割算の余り)を求める演算を論理演算と加減算とビットシフトのみで行う方法がありましたら教えてください。 言語はC/C++ではなくても大丈夫です(ロジックだけでも)。

  • 繰り返しの演算

    C言語についてです 数値データのファイルからデータを読み取り四則演算をするプログラムをつくっているのですが、2つでペアの数値データが4つあります。これを繰り返し演算できるようにする関数はありますか?

  • 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
  • 関係演算子について

    =(イコール)の下にもう1つ横棒がついた関係演算子の意味を教えてください。ネットで関係演算子とかのキーワードで検索すると、Texのコマンドや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
  • 演算子について

    基本的な質問だったら申し訳ないのですが、自分ではちょっと解決できないのでお答えいただけたらありがたいです。 シュレディンガー方程式の波動関数ψ(x)の問題でエネルギーの期待値を求めるときには演算子としてih'd/dxを使うというのは教科書にかいてありわかったのですが、x自体の期待値を求めよという問題では何か別の演算子をつかうのでしょうか? 的を得た質問でなっかたらすいません。

  • 二項演算子"%"

    今,Red hut Linux8.0を使い、C言語でいろいろやってるんですが、二項演算子の%をプログラム中に入れると、 関数 `main' 内: 二項演算子 % が不適切です ってでます。友だちのOSLinux 7.3では出来たので、僕のOSだけできないのは不思議でたまりません。いったい何が原因なんでしょうか?

  • ビット演算について

    ビット演算ができないダメグラマーです。 10101010 C言語でバイト値の3ビット目の値が0の時は1に1の時は0(ビットを反転)にするにはどのように書くのでしょうか?

専門家に質問してみよう