2진수 숫자체계 음수 표현
우리가 사용하는 컴퓨터는 숫자를 2진수 체계로 표현합니다.
그 중에서 음수를 표현할 때에는 맨 첫 bit를 사용하여 검사하는데 맨 첫 bit가 0이라면 양수, 1이라면 음수로 처리합니다.
1byte의 크기에서 예시를 들어보겠습니다.
ex 1) 1 = 0000 0001
ex 2) -1 = 1111 1111
그런데 -1이 왜 1111 1111
라는 bit값을 가질까요?
그 이유는 어떤 한 양의 정수에 -1을 곱한 음의 정수값은 원래 값의 보수
이기 때문입니다.
역으로 생각하면 어떤 한 음의 정수값에 -1을 곱한 양의 정수값도 마찬가지로 원래 값의 보수
입니다.
(보수를 구하는 법은 어떤 한 값 N
의 모든 bit
를 0은 1로 1은 0으로 바꿔준 후, +1을 진행해주면 됩니다.)
그런데 여기서 치명적인 오류가 하나 발생합니다.
1byte (8bit)의 크기를 가진 어떤 정수 N이 존재한다고 가정합시다.
N이 일반적인 어떤 다른 값을 가지고 있다면 상관이 없겠지만, N이 만일 -128
그러니까 bit값으로는 1000 0000
이라는 값을 갖고있다면 어떻게 될까요?
위의 N이라는 값을 절대값을 만들어본다고 생각해봅시다.
그럼 자연스레 N의 모든 bit는 반전이 된 후 +1이 될 것입니다.
1000 0000
->(반전) 0111 1111
->(+1) 1000 0000
엥 놀랍게도 다시 원래의 값인 -128
로 돌아오게 되었습니다.
짜잔~~
와우 ㄷㄷ