4

このCプログラムに負の数が入力されたときに、このプログラムがモジュラス演算に対して間違った答えを返す理由を誰かが理解するのを手伝ってくれますか?

問題の原因は機能にあると確信していscanfます。正の整数を使用すると、正しい答えが得られます。

コードは以下のとおりです。

#include <stdio.h>

int main()
{
    int num1 = 0;
    int num2 = 0;
    int answer = 0;
    puts("enter two number to find the modulus of...");
    if (scanf("%3d %3d",&num1,&num2) != 2)
            puts("something went wrong");
    else {
            answer = (num1 % num2);
            printf("the modulus of %d and %d is: %d\n", num1, num2, answer);
    }
}
4

2 に答える 2

4

ANSI C では、モジュラス演算子の結果の符号は、負の入力に対して定義されていません。div()数学ライブラリ ( ref ) から試すことができます。商と余りを含む構造体を返し、負の入力に対して確実に機能します。

または、Alexey Frunze が親切に提案したように、C99 モードを有効にすることもできます。私は標準を調べるのが面倒ですが、少しテストしたところ ( gcc -std=c99)、結果の符号が左オペランドの符号と一致することがわかりました。ANSIdiv()互換性が必要な場合は、それでも最適です。

または、状況を完全に制御することもできます。しかし、正しい意味を選択する必要があります。以下、ウィキペディアより転載。

int x, y, q, r; // all snippets: left-arg, right-arg, quotient, remainder

切り捨てられた除算

q = trunc( (double)x / y);
r = x - y * q;

フロア分割 (クヌート)

q = floor( (double)x / y);
r = x - y * q;

ユークリッド除算

q = y > 0 ? floor( (double)x / y) : ceiling( (double)x / y);
r = x - y * q;
于 2013-04-26T07:26:08.570 に答える