정수 나눗셈(Integer Division)란?

정수끼리의 나눗셈에서 몫을 정수로 만드는 연산. 소수점 이하의 처리는 언어에 따라 달라, 0에 가까운 쪽으로 버리는 것(C, Java)과 작은 쪽으로 내리는 것(Python의 //)이 있다. 양수끼리에서는 같은 결과가 되지만 음수에서는 다르다.

일본어 명칭: 整数除算

정수 나눗셈(Integer Division)은(는) 컴퓨터 산술, 프로그래밍의 기초(의사 코드 트레이스) 등 2개 분야의 연습 문제 3개에 나와요.

분야: 프로그래밍의 기초(의사 코드 트레이스)

음수에서의 차이

−7을 2로 나누면, 몫을 0에 가까운 쪽으로 버리는 C나 Java에서는 몫이 −3, 나머지가 −1입니다. 작은 쪽으로 내리는 Python의 //에서는 몫이 −4이고, %의 나머지는 1이 됩니다. 어느 쪽이든 '몫 × 제수 + 나머지 = 피제수'가 성립하며, 나머지의 부호는 C에서는 나누어지는 수와 같고, Python에서는 나누는 수와 같아집니다. 음수를 다루는 프로그램을 다른 언어로 바꿔 쓸 때 오류의 원인이 됩니다.

의사 코드에서의 취급

의사 코드 문제에서는 ÷ 결과의 소수점 이하를 어떻게 다루는지를 문제 문장에서 설명합니다. 예를 들어 '정수형 변수에 대입할 때는 소수점 이하를 버린다'고 되어 있으면, (lo + hi) ÷ 2의 결과를 정수형 mid에 대입할 때 lo + hi가 홀수이면 0.5가 버려집니다. 이진 탐색의 중앙 위치 등에서 이 버림이 결과를 좌우합니다.

시프트와의 관계

2의 거듭제곱으로 나누는 정수 나눗셈은 2진수의 오른쪽 시프트로도 계산할 수 있습니다. 부호 없는 정수라면 x를 2로 나눈 몫은 x를 1비트 오른쪽으로 민 값입니다. 다만 음수의 산술 오른쪽 시프트는 작은 쪽으로 내림이 되므로, 0 쪽으로의 버림과는 결과가 다를 수 있습니다.

도전해 보기: 정수 나눗셈(Integer Division) 관련 문제

IEEE 754 부동소수점수 연산에서 양수를 0으로 나눴을 때의 결과로 규격에 정해진 것은 무엇입니까?

  1. A0
  2. B가장 큰 정규화수
  3. C양의 무한대
정답과 해설 보기

정답: C. 양의 무한대

IEEE 754에서는 0이 아닌 수를 0으로 나누면 부호에 따라 양 또는 음의 무한대를 반환하도록 정하고 있습니다. 무한대는 지수부가 모두 1이고 가수가 0인 비트열로 나타내며, 오버플로했을 때의 결과에도 사용됩니다. 프로그램을 멈추지 않고 계산을 이어갈 수 있으며, 나중에 결과를 조사하여 이상을 발견할 수 있습니다. 한편 0 ÷ 0은 값이 정해지지 않으므로 NaN이 됩니다. 정수 나눗셈과 달리 부동소수점에서는 예외로 중지하지 않는 것이 기본값입니다.

C 언어에서 int형의 −7 / 2와 −7 >> 1(산술 오른쪽 시프트인 경우)의 결과 조합으로 올바른 것은 무엇입니까?

  1. A−7 / 2는 −3, −7 >> 1은 −4
  2. B둘 다 −4
  3. C−7 / 2는 −4, −7 >> 1은 −3
정답과 해설 보기

정답: A. −7 / 2는 −3, −7 >> 1은 −4

C 언어(C99 이후)의 정수 나눗셈은 결과를 0 방향으로 버리도록 정해져 있으므로 −3.5는 −3이 됩니다. 한편 산술 오른쪽 시프트는 작은 쪽(음의 무한대 방향)으로 버리는 동작이 되어, −7(1111 1001)을 오른쪽으로 1비트 이동하면 1111 1100 = −4가 됩니다. 그래서 음수에서는 시프트와 나눗셈이 일치하지 않습니다. 컴파일러가 2로의 나눗셈을 시프트로 바꿀 때는 음수를 위한 보정 명령을 추가합니다. 양수라면 둘은 일치합니다.

자주 묻는 질문

0으로 나누면 어떻게 되나요?

정수를 0으로 나누면 많은 언어에서 실행 시 오류(예외)가 되며, C 언어에서는 정의되지 않은 동작입니다. 프로그램에서는 나누기 전에 제수가 0이 아닌지 확인합니다.

정수 나눗셈의 몫과 나머지에는 어떤 관계가 있나요?

몫을 q, 나머지를 r이라고 하면 피제수 = q × 제수 + r이 성립합니다. 몫과 나머지는 쌍으로 정해지므로, 몫의 반올림 방식(버림인지 내림인지)이 바뀌면 나머지도 바뀝니다.

해설 속 정수 나눗셈(Integer Division)

정수 나눗셈(Integer Division)이(가) 나오는 문제 (3)

  1. IEEE 754 부동소수점수 연산에서 양수를 0으로 나눴을 때의 결과로 규격에 정해진 것은 무엇입니까?
  2. C 언어에서 int형의 −7 / 2와 −7 >> 1(산술 오른쪽 시프트인 경우)의 결과 조합으로 올바른 것은 무엇입니까?
  3. ÷는 나눗셈이며, 정수형 변수(인수 포함)에 대입할 때는 소수점 이하를 버린다. 다음 함수 f를 f(9087)로 호출했을 때의 반환값은?

관련 용어

IEEE 754 지수부(Exponent) 가수(Mantissa) NaN 변수(Variable) 인수(Argument) 반환값(Return Value) 객체 지향(Object-oriented Programming) 나머지 연산(Modulo Operation) 단락 평가(Short-circuit Evaluation)

용어집으로 돌아가기