1 - Integer.MIN_VALUE = ? (feat. 컴퓨터는 뺄셈을 어떻게 연산할까?)

김강연·2022년 7월 19일
0
post-thumbnail

작성 배경

Do it 자료구조 및 알고리즘 교재에서 static Arrays.binarySearch(T[] a, T key, Comparator<? super T> c) 메소드를 학습 중에 이를 뜯어보고 있었다. 문득 Comparable 인터페이스와 Comparator 인터페이스는 무엇이 다른지 궁금해져 이를 찾아보면서 해당 글을 발견하였다.

자바 [JAVA] - Comparable 과 Comparator의 이해
(출처: 작성자 ST_)

작성자분 덕분에 좋은 지식을 얻고 있던 중, 특정 문단에서 의문이 들었다.

본론

오버플로우(Overflow)와 언더플로우(Underflow)를 복습하였고, 빨간 박스와 같이 o1 = 1, o2 = -2,147,483,648 라고 할 때 o1 - o2 의 값은? 이라는 의문을 풀어보려 하였다. 하지만 잘 풀리지 않았고, 작성자분께서 하단에 이어 작성한 부분도 뭔가 내 예상과 완전히 뒤떨어졌다.(실수를 하신 걸로 판단된다.) 그래서 해당 의문을 가졌을 때는 밖에 있었던 탓에 끄적끄적 비트 연산을 해보았다.

그런데, 뺄셈은 어떻게 비트 연산을 하는지 까먹어 버린 나는 해당 글도 참고를 하게 되었다.

1의 보수, 2의 보수, 컴퓨터에서의 뺄셈

해당 글에서 볼 수 있듯이 컴퓨터에서 뺄셈은 빼고자 하는 피연산자를 2의 보수를 취한 후 이를 더해주는 방식을 취한다.
그럼 Byte 타입의 최솟값 -128을 2의 보수를 취해 보자.
Original num: 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0
ones' comple: 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1
------------------+1----------------------🡣
two's comple: 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0

이런! 2의 보수를 취하기 전 값과 2의 보수를 취한 값의 비트가 동일한 것을 확인할 수 있다.

이는 즉, primitive한 정수형 타입의 최솟값의 2의 보수는 최솟값과 동일하다는 걸 알 수 있다.
이를 위 가정에 대입해보자.
o1 - o2
= 1 - min
= 1 - (-2,147,483,648)
= 1 + (-2,147,483,648)
= -2,147,483,647
이라는 것을 확인할 수 있다. 이를 확인하는 소스코드 및 출력 결과도 확인해보자.

import java.text.DecimalFormat;

public class test {
	public static void main(String[] args) {
		DecimalFormat f = new DecimalFormat("#,###,###,###,###");
		int min = Integer.MIN_VALUE;
		int max = Integer.MAX_VALUE;

		System.out.println("min: " + f.format(min));
		System.out.println("max: " + f.format(max));
		System.out.println("min - 1 = " + f.format(min - 1));
		System.out.println("max + 1 = " + f.format(max + 1));
		System.out.println("1 - min = " + f.format(1 - min));
	}
}

profile
Oasis of Knowledge

0개의 댓글