2011-09-17 2 views
5

저는 정의에 대해 질문하는 것이 아니라 언어 작성자가 C++에서 비대칭 동작으로 모듈러스를 정의하는 이유를 묻습니다. (나는 또한 자바라고 생각한다)모듈러스가 프로그래밍 언어로 정의 된 이유

f로 나눌 수있는 n보다 크거나 같은 최소 수를 찾고 싶다고 가정 해 보자. n이 양수이면

, 그럼 내가 할 n은 음수

if(n % f) 
    ans = n + f - n % f; 

경우 부정과 긍정적 인 숫자를 처리 할 때

ans = n - n % f; 

분명히,이 정의가 가장 편리한 아니다. 그렇다면 왜 이렇게 정의 되었습니까? 어떤 경우에 편의를 제공합니까?

+0

왜 모듈러스가 음수 피연산자에 대한 고정 된 정의가 없는지 묻고 있습니까? –

+0

http://en.wikipedia.org/wiki/Modulo_operation – starblue

+0

명확히하려면 : 왜 정의가 첫 번째 피연산자의 패리티와 비대칭인지 묻습니다. –

답변

1

"모듈로 2 산술"을 사용하기 때문에 각 2 진수는 다른 것과 독립적으로 처리됩니다. "부서"에 대한 예를보세요 here

+0

하지만 그렇지 않습니다. Modulo-2 산술은 모듈러스 연산자가 아닌 CRC를 계산할 때 사용됩니다. – EJP

1

당신은 틀렸어요. n가 음수 인 경우라도, 식 (a/b)*b + a%b 항상 a을 수득한다 ab 주어진 이처럼, C++은 나머지 연산자의 결과 %/의 결과가 일치로 긴 네거티브 또는 포지티브 중 하나가 될 수있다. C99을 사용하려면 a % b의 결과에 a과 같은 부호가 있어야합니다. 다른 언어 (예 : Python)에서는 a % b의 부호에 b과 같은 부호가 있어야합니다.

이것은 음수가 n 인 표현식이 실제로 C++에서 작동하지 않아도된다는 것을 의미합니다. n%f이 양수를 산출하면 (n이 음수 일 때) ansn보다 작을 때 나타납니다.

+0

'(a/b) * b + a % b'는 'b'가 0 인 경우를 제외하고 항상 'a'를 산출합니다. 그런 다음 동작은 정의되지 않습니다. – JohnPS

+1

* "n이 음수 일 때, ... *"결과는 배당 또는 제수가 음수이면 C++ 03에 정의 된 구현입니다. 그러나 대부분의 C++ 컴파일러는 C99 규칙을 따릅니다. 이를 통해 공급 업체는 C 및 C++ 코드에 대해 동일한 기계를 사용할 수 있습니다. C++ 11은 C99 규칙을 따릅니다. 더 이상 정의 된 구현이 아닙니다. –

+0

@David : 부정적인 피연산자가 구현 정의 결과로 이어지는 것을 지적한 것으로 생각했지만, n이 음수라는 점에 대해 구체적으로 얘기 했으므로 그 점을 더 잘 논의하기로 결정했습니다. 유사성에 관한 한, C99는 리더보다 추종자입니다. 즉, 근본적으로 모든 현대 하드웨어가 그런 방식으로 작동하기 때문에 표준화했습니다. 한 예로, 마이크로 소프트는 x86'div' 명령어가 생성하는 것을 사용하는 것으로 보이고 C99 적합성에 대한 명백한 관심을 보이지 않는다. –

관련 문제