2010-08-05 4 views
0

나는 다음과 같은 코드가 있습니다Obj에서 이상한 모드 동작. C

NSInteger index1 = (stop.timeIndex - 1); //This will be -1 
index1 = index1 % [stop.schedule count]; // [stop.schedule count] = 33 

그래서 내가 표현 -1 % (33)이 나에게 32을 주어야한다가를 대신 나에게 세를주고있다 ... 나는 두 배의 값을 확인했습니다 디버거. 누구든지 아이디어가 있습니까?

+0

'%'는 C 및 Objective-C에서 음수 입력에 대해 예상 한 것과 다르게 동작합니다. 이전의 다음 질문을 참조하십시오. http://stackoverflow.com/questions/2430737/modulo-operator-in-objective-c-returns -the-wrong-result –

+0

아마 중복으로 닫을 필요가있다 : http://stackoverflow.com/questions/2430737/modulo-operator-in-objective-c-returns-the-wrong-result –

답변

2

C99 섹션 말한다 6.5.5 곱하기 연산자 (굵은 내)

/ 연산자의 결과는 제 의해 제 피연산자의 분할로부터의 몫이고; % 연산자의 결과는 나머지입니다. 두 연산 모두에서 의 값이 두 번째 피연산자가 0이면 동작은 정의되지 않습니다.

정수를 나눌 때 / 연산자의 결과는 소수 부분이 삭제 된 대수 몫입니다. a/b의 지수를 나타낼 수있는 경우 (a/b)*b + a%ba과 같아야합니다.

%은 나머지이며 "modulus"라는 단어를 사용하지 않습니다. 사실, "모듈러스"라는 단어는 C99의 사본 3 개에서만 발생하며, 모든 것은 도서관과 관련이 있으며 운영자와 관련이 없습니다.

나머지는 양수 여야한다고 말하는 것은 아닙니다. 양수 나머지가 필요한 경우 a%b(a%b + b) % b으로 다시 작성하면 ab의 부호에 대해 작동하며 추가 및 나누기를 제외하고 긍정적 인 답을 제공합니다. 누락 된 분기 또는 추가 분할이 목표 아키텍처에서 더 저렴한 지 여부에 따라 m=a%b; if (m<0) m+=b;으로 계산하는 것이 더 쌀 수도 있습니다.

편집 : 나는 Objective-C에 대해 아무것도 모른다. 귀하의 예제는 Objective-C 코드 인 것처럼 보였지만 원래 질문에는 C로 태그가 붙었으며 현재까지의 모든 대답에는 C 언어가 반영되어 있습니다. 나는 C에 대해 진실인지 아는 것이 도움이된다고 가정하고 있습니다.

6

C에서는 모듈러스 연산자가 음수와 함께 작동하지 않습니다. (일반적인 이름에서 알 수 있듯이 모듈러 산술 대신 나머지를 제공합니다.)

1

음수에서 mod 연산자를 사용하면 결과가 예상치 않은 경우가 많습니다. 예를 들어, 다음과 같습니다.

#include <stdio.h> 

int main() { 
    int n = -1 % 33; 
    printf("%d\n", n); 
} 

은 GCC와 함께 -1을 생성하지만 표현식이 32로 평가 될 것으로 기대하는 이유는 알 수 없습니다. 일반적으로 이러한 작업을 수행하지 않는 것이 좋습니다. 특히 코드를 이식 할 수있게하려는 경우 더욱 그렇습니다.

+0

나는 LLVM 그래서 아마 차이를 설명하지만, 32는 올바른 수학적 솔루션입니다; 그것은 또한 파이썬이 표현을 평가하는 방법입니다. – kodai