
64-bit 자료형을 활용하지 않고 숫자를 뒤집었을 때 오버플로우가 발생하는지 확인하는 문제이다.
숫자를 뒤집을 때 사용하는 로직은 다 비슷할 텐데, 주의해야 할 점은 10을 곱했을 때 오버플로우가 여러 번 발생할 수 있다는 점이다. 그래서 단순히 매 반복마다 부호를 대조하는 것은 유효하지 않다.
뒤집은 숫자를 에 저장한다고 가정하자. 매 반복마다 연산을 수행할 텐데, 연산 수행 전 의 값을 별도의 변수()에 저장해 두고 연산 수행 이후 과 의 값을 비교하면 된다.
오버플로우가 발생할 시에는 MSB(Most Significant Bit or Left-Most bit)에서 발생한 carry bit가 절삭되기 때문에 32-bit 자료형을 사용할 때는 위의 역 연산으로 오버플로우 발생 시 어떠한 경우에도 원래의 값을 복원할 수 없다.
class Solution {
public int reverse(int x) {
int t = Math.abs(x), y = 0;
while (t > 0) {
int p = y;
y = y * 10 + (t % 10);
if ((y - (t % 10)) / 10 != p)
return 0;
t /= 10;
}
return x > 0 ? y : -y;
}
}