[c] 정수 나누기의 동작은 무엇입니까?

예를 들어

int result;

result = 125/100;

또는

result = 43/100;

결과는 항상 부서의 바닥입니까? 정의 된 동작은 무엇입니까?



답변

결과는 항상 부서의 바닥입니까? 정의 된 동작은 무엇입니까?

예, 두 피연산자의 정수 몫입니다.

6.5.5 곱하기 연산자

6 정수를 나누면 / 연산자의 결과는 분수 부분을 버린 대수 몫입니다. 88) 몫 a / b가 표현 가능하면, 식 (a / b) * b + a % b는 a와 같아야한다.

그리고 해당 주석 :

88) 이것을“0으로 자르기 ”라고합니다.

물론 주목해야 할 두 가지 사항은 다음과 같습니다.

3 일반적인 산술 변환은 피연산자에서 수행됩니다.

과:

5 / 연산자의 결과는 첫 번째 피연산자를 두 번째 피연산자로 나눈 몫입니다. % 연산자의 결과는 나머지입니다. 두 연산에서 두 번째 피연산자의 값이 0이면 동작이 정의되지 않습니다.

[참고 : 강조 광산]


답변

Dirkgently는 C99의 정수 나눗셈에 대한 훌륭한 설명 을 제공 하지만 C89에서는 음의 피연산자가있는 정수 나눗셈에 구현 정의 방향이 있음을 알아야합니다.

ANSI C 초안 (3.3.5)에서 :

피연산자가 음수 인 경우, / 연산자의 결과가 대수 지수보다 작은 최대 정수인지 또는 대수 지수보다 큰 최소 정수인지 여부는 % 연산자 결과의 부호와 같이 구현 정의됩니다. 몫 a / b가 표현 가능한 경우, 표현 (a / b) * b + a % b는 a와 같아야합니다.

따라서 C89 컴파일러가 붙어있을 때 음수로 조심하십시오.

FOR99가 그렇게했기 때문에 C99가 0으로 잘림을 선택했다는 것은 재미있는 사실입니다. comp.std.c 에서이 메시지 를 참조하십시오.


답변

결과가 음수이면 C가 바닥이 아닌 0으로 잘립니다. 파이썬 정수 나누기가 왜 항상 여기에 있는지에 대한이 독서를 배웠습니다. 왜 파이썬의 정수 나누기 마루


답변

예, 결과는 항상 0으로 잘립니다. 가장 작은 절대 값으로 반올림합니다.

-5 / 2 = -2
 5 / 2 =  2

부호없는 및 음이 아닌 부호있는 값의 경우 이는 바닥과 같습니다 (-Infinity로 반올림).


답변

결과는 항상 부서의 바닥입니까?

아니요. 결과는 다양하지만 변동은 음수 값에 대해서만 발생합니다.

정의 된 동작은 무엇입니까?

정수 나누기가 0으로 반올림되는 동안 바닥이 음의 무한대로 명확하게 반올림되도록합니다 (잘라 내기)

양수 값은 동일합니다.

int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0

음수의 경우이 값이 다릅니다

int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0


답변

나는 사람들이 귀하의 질문에 대답했지만 평신도 용어로 알고 있습니다.

5 / 2 = 2 // 5와 2는 모두 정수이므로 정수 나누기는 항상 소수를 자릅니다.

5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5 // 여기서 5 또는 2 또는 둘 다에 소수점이 있으므로 몫은 10 진수입니다.


답변