더북(TheBook)

4.1.2 나눗셈과 나머지

정수의 나눗셈과 나머지 연산을 표현하는 /% 연산자는 앞에서 본 세 가지 산술 연산자(+, -, *)에 비해 좀 복잡하며, 사용 빈도도 상대적으로 낮을 가능성이 높다. a/b란 표현식은 ab로 나눈 값으로 평가되고, a%bab로 나눈 나머지 값으로 평가되며 여기서 b의 최대 수는 a에서 제외한다. /% 연산자는 항상 짝을 이룬다. z = / b라는 식이 있다면, 이 연산에서 나머지에 해당하는 a % ba - z*b로 구할 수 있다.

TAKEAWAY 4.4 부호 없는 값이라면 a == (a/b)*b + (a%b)가 성립한다.

% 연산자를 응용한 대표적인 예로 시간이 있다. 가령 12시간 기준 시계에서 8:00으로부터 6시간 후는 2:00이다. 12시간 또는 24시간으로 표현하는 시계에서 시간 차를 % 연산자로 표현할 수 있다(예를 들어 a % 12). 그래서 08:00부터 6시간 후를 % 연산으로 계산하면 (8 + 6) % 12 == 2다.Exs 1 비슷한 예로 분 단위로 주어진 값이 몇 시간인지를 a % 60으로 구할 수 있다.

/% 연산에서 사용할 수 없는 숫자가 딱 하나 있다. 바로 0이다. 0으로 나눌 수 없기 때문이다.

TAKEAWAY 4.5 부호 없는 /%에서 두 번째 피연산자는 0일 수 없다.

% 연산자는 부호 없는 타입에 대한 덧셈과 곱셈 연산을 보완하는 용도로도 사용한다. 앞에서 설명했듯이 부호 없는 타입에 대한 값이 허용 범위를 벗어나면 오버플로(overflow)C가 발생한다. 이럴 때는 마치 % 연산자가 적용된 것처럼 계산 결과가 축소된다. 다시 말해 해당 타입의 허용 구간의 시작점으로 되돌아간다. 예를 들어 size_t의 허용 구간은 [0, SIZE_MAX]이며 오버플로 발생 시 0으로 돌아간다.

 

 


Exs 1 24시간으로 표현하는 시계에서 10:00으로부터 3시간 지난 시각과 20:00에서 8시간 지난 시각을 계산하는 코드를 작성해 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.