hoyyang22   2년 전

입력받은 숫자의 전체 합에서 1부터 n-1까지를 합한 수를 빼면 정답이 나온다는 방식으로 접근했고, AC를 받았습니다.

다만 제출하고 코드를 다시 보니 무언가 이상해서 질문합니다.

간단히 생각해보아도 1부터 1000만까지 전부 더하면 대략 50조정도가 나오는데, 이는 int형의 표현범위를 훨씬 넘어선 것이 아닌가요? 어떻게 total과 real_total이 제대로 입력이 된 상태가 되고, 연산이 되는 것인지 궁금합니다.

djm03178   2년 전

원칙적으로는 정수형의 범위를 넘어서면 undefined behavior지만, 일반적인 레지스터의 정수 연산 메커니즘상 덧셈 / 뺄셈에서 전체 범위가 하나의 사이클이 되어 최대를 넘어가면 최소로 돌아오게끔 되곤 합니다.

jisung6723   2년 전

int 형의 범위를 넘어가는 건 맞는 거 같습니다.

int형이 2147483647까지이고 이를 넘어가면 -2147483648이 되고 계속 계산된다고 하네요.

더하는 순서는 상관 없으니까 total에만 처음에 한번 더 쓰는 값을 주고

 그 다음에 1부터 더해나가면 total - real_total의 값은 일정하게 유지됩니다.

-2147483648 부터 2147483647까지 써져있는 원형트랙을 따라 total과 real_total이 일정 거리를 유지하면서 움직인다고 생각하면 편하네요.

hoyyang22   2년 전

즉 overflow한 횟수가 같으면 결국 차이는 일정하니 값이 제대로 나온다는 말이군요. 감사합니다.

댓글을 작성하려면 로그인해야 합니다.