2021. 5. 14. 00:22ㆍJava/Etc
프로그램에서 음수 표현 방식
프로그램에서 음수는 어떻게 표현하는 걸까?
음수 표현방식에 대해 알아보자!!
프로그램에서 모든 연산은 2진수로 이루어진다.
이 때문에 2진수에서 음수를 나타내는 방법으로 부호를 나타내는 최상위 비트(MSB : Most Significant Bit)를 사용하는 것인데, 이 최상위 비트를 부호 비트라고 한다.
부호 비트가 0이면 양수, 1이면 음수를 나타내는 방식이다.
가장 작은 데이터 단위인 byte를 기준으로 설명하면,
실제로 1byte는 8bit로서 2진수로 표현하게 되면 0000 0000 ~ 1111 1111까지 단위를 표현하게 되는데,
이는 10진수로 0 ~ 255가 되고 이렇게 되면 양수만 표현할 수 있기 때문에 2진수에서 음수를 표현하기 위해서 제일 첫 번째 비트를 가지고 부호를 판별하도록 한 것이다.
그럼 부호 비트를 제외한 7bit로 표현할 수 있는 범위는?
단편적으로만 보면 아래처럼 표현할 수 있을 것이다.
양수 0000 0000 ~ 0111 1111 (0 ~ 127)
음수 1000 0000 ~ 1111 1111 (-0 ~ -127)
하지만 실제로 음수의 경우 실제 범위는 -0 ~ -127 이 아닌 -128 ~ -1이다.
양수 0000 0000 ~ 0111 1111 (0 ~ 127)
음수 1000 0000 ~ 1111 1111 (-128 ~ -1 )
부호 비트를 제외한 1000 0000 은 -0인데 왜?? -128인 거지??
이 부분은 -0이 존재하지 않는 수이기 때문에 byte로 표현할 수 있는 음수의 가장 작은 수인 -128 이 되는 것이고,
1000 0001 두 번째 작은 수인 -127
......
1111 1111 음수 중 표현할 수 있는 가장 큰 수인 -1까지 표현하게 되는 것이다.
그럼 이제부터 저 음수의 표현법에 대해 자세히 알아보자.
프로그램에서 음수를 표현하는 방법은 보수(Complement Number System)를 이용한다.
① 1의 보수 (One`s complement)
- 단지 `1`을 `0`으로, `0`을 `1`로 바꾸기만 하면 됨. 이를 자기 보수(self-complement)라고도 한다.
- 1의 보수 사용 시 단점은 위에서 이야기한 (-0)과 (0)이 동시에 존재할 수 있기 때문에 문제가 발생한다.
- 표시범위 : -2n-1 ~ 2n-1
② 2의 보수 (Two`s complement)
- 양수는 음수로 음수는 양수로 바뀐다
- 쉽게 설명하면 하면 1의 보수 값에 1을 더한 수와 같다.
0000 0001 (1)
------------------
1111 1110 ( 1의 보수) - 비트 치환
+ 0000 0001 ( 1을 더함)
------------------
1111 1111 (-1) - 2의 보수
- 값은 부호 비트(MSB)가 음수 `1` 인경 우만 10진수 값에서 2n을 빼면 됨 (n은 bit단위임)
(1000 0000)2 - (28) = 128 - 256 = -128
(1000 0001)2 - (28) = 129 - 256 = -127
.....
(1111 1111)2 - (28) = 255 - 256 = -1
- 표시범위 : -2n-1 ~ 2n-1-1
- 0은 양수도 음수도 아니지만 부호 비트 처리를 통해 0이 양수로 포함되기 때문에 양수의 표시범위 차이가 생겨나게 된다.
결과적으로 프로그램에서 음수를 표현하기 위해서는 2의 보수를 사용한다!!!
프로그램에서 2의 보수를 사용함으로써 '음수의 표현' 및 '연산의 효율을 높임'
이 두 가지의 장점이 존재하는데 마지막으로 연산의 효율을 높이는 이유에는 어떤 게 있는지 정리하고 끝내보자.
2의 보수를 이용한 연산 방법
컴퓨터는 덧셈 연산 회로만 존재한다!!
이 때문에 뺄셈을 수행하기 위해서는 2의 보수를 구해 해당 값을 더해주면 뺄셈 연산과 동일한 처리가 됨으로 뺄셈 연산 회로가 존재하지 않는다.
예를 들어 설명하면 1 - 1이라는 뺄셈 연산을 진행하기 위해서는 1 + (-1)과 같이 덧셈 연산으로 처리를 해서 결과를 얻는다.
그럼 실제 덧셈으로 연산이 이뤄지는 과정을 보면
0000 0001 1
+ 1111 1111 -1
------------------
1 0000 0000 0 //실제로는 표현의 범위를 넘어가 버렸다.
이 부분에 대해서는 해당 자료형의 범위를 초과 자리는 무시하도록 처리되기 때문에 8bit를 가지고만 판단하면 0이 되는 것이다.
다시 한번 이야기하면
프로그램에서 음수 == 2의 보수로 통한다!!
'Java > Etc' 카테고리의 다른 글
문자열(String) Class 사용법 (0) | 2021.08.09 |
---|---|
불변 객체(Immutable Object) (0) | 2021.06.04 |
About String Class (0) | 2021.05.22 |