짧은 답변 :
(a/b)*b + a%b
가 a
같다는 것을 표준 보증.
C99에서 나누기 /
의 결과는 0으로 잘립니다. %
연산자의 결과는이 경우 -1
입니다.
C89에서 division /
의 결과는 음수 피연산자에 대해 잘릴 수 있습니다. 따라서 %
연산자의 결과는 기계에 따라 다릅니다.
긴 않음 : C99 6.5.5
5/연산자의 결과로부터
는 번째로 첫 번째 피연산자의 분할로부터의 몫이고; % 연산자의 결과는 나머지 값입니다. 두 연산 모두에서 의 값이 두 번째 피연산자가 0이면 동작은 정의되지 않습니다.
6 정수를 나눌 때/연산자의 결과는 소수 부분이 삭제 된 대수 몫입니다. 몫 a/b가 표현 가능한 경우, 표현 (a/b) * b + a % b는 a와 같아야합니다. 그렇지 않으면 a/b와 a % b의 동작은 정의되지 않은 입니다.
그리고 같은 페이지에 각주는
/
작품, 그것이 말하는 방법을 설명하기 :
이 종종 '0으로 절단' ''라고합니다.
이 규칙에 따르면, -111/11
이뿐만 아니라 1 (a/b)*b + a%b
때문에이 a
동일해야합니다, -10
할 수 있습니다, 우리는 -111 % 11
가 -1
입니다 있습니다. 조치가 취해진 다 같이
대한 절단의 방향 및/%에 대한 결과의 표시 장치 의존 음의 피연산자 같습니다
그러나 K & R 장 2.5 다른 답을 준다 오버플로 또는 언더 플로.
이 내용에 따르면 -1
또는 10
이 합법적 인 결과 일 수 있습니다.
이유는 C89 3.3.5이다 :
정수 분할 두 피연산자가/연산자의 결과 긍정적 인 경우 분할이 부정확 졌을 대수 지수보다 큰 정수 이하 % 연산자의 결과는 양수입니다. 두 피연산자가 음수이면/연산자의 결과가 대수 몫보다 작은 가장 큰 정수 또는 대수 몫보다 큰 가장 작은 정수인지 여부는 구현자가 정의합니다 (% 연산자 결과의 부호와 동일). 몫 a/b가 표현 가능한 경우, 표현 (a/b) * b + a % b는 a와 같아야합니다.
C89에서 C99로 변경되었습니다.
C99 근거 6.5.5 일부 역사적인 이유로 제공 구현 정의 방식으로 상하로 반올림 수 네거티브 피연산자를 포함한 정수 C89에서
, 분할 단계; 의도는 특별한 경우를 확인하고 특정 동작을 시행하기 위해 런타임 코드에서 오버 헤드가 발생하지 않도록하는 것이 었습니다. 그러나 Fortran에서는 결과가 항상 0으로 잘 리며 오버 헤드가 숫자 프로그래밍 커뮤니티에서 받아 들일 수 있습니다. 따라서 C99는 이제 Fortran에서 C 로의 코드 포팅을 용이하게 해주는 유사한 동작을 요구합니다.이 문서의 §7.20.6.2의 표는 필요한 의미를 보여줍니다.
그리고 여기가 §7.20.6.2 테이블의 :
numer denom quot rem
7 3 2 1
–7 3 –2 –1
7 –3 –2 1
–7 –3 2 –1
아, 파이썬은 모든 특별한 경우 (수학적 의미에서) 바로 그것을 점점 기억 :-) 이전 음의 피연산자 계수. – Cameron
C의 '%'연산자를 예상 한 방식으로 작동하는 모듈에 적용하려면 다음과 같이하십시오 :'((a % b) + b) % b' – paddy
wikipedia 페이지에 아주 멋진 테이블이 있습니다. 모듈로 각 언어가 어떻게 모듈로 구현되는지 보여주는 연산 : http://en.wikipedia.org/wiki/Modulo_operation –