부호 비트

'''
부호 비트
부호가 있는 데이터의 경우, MSB는 부호의 의미를 가지게 됩니다. MSB가 0이면 양수, 1이면 음수를 나타냅니다. 프로그래밍 언어에서 부호(+, -)를 가지는 데이터는 Signed 데이터 또는 부호가 있는 데이터라 부르고, 부호없이 양수(+)만 나타내는 데이터는 unsigned 데이터 또는 부호가 없는 데이터라 부릅니다.

예를 들어 앞서 살펴본 0b10010100가 부호가 있는 데이터라면, MSB가 1이기 때문에 10진수로 표현하면 음수인 -108이 됩니다.

반면에 부호가 없는 데이터라면, MSB인 1은 부호를 의미하지 않고, 값을 의미하므로 양수인 148이 됩니다.
'''

에서 부호가 있는 데이터 일 때 MSB가 1이기 때문에 10진수로 표현하면 음수인 -108이라는 게 이해가 안갑니다.. 왜 갑자기 108이 나온거죠..?

작성자 정보
답변 1
흠챼샤
대표 업적 없음

부호가 없는 데이터는 음수를 표현하지 못합니다
음수를 표현하기 위해서는 부호 비트가 필요한데 표현 방법으로는 부호절대값(SignMagnitude), 1의 보수, 2의 보수 세 가지 방식이 있습니다

부호절대값

부호절대값 방식에서 MSB는 부호를 나타내고 나머지 비트들은 수를 나타냅니다
0b10010100을 부호절대값으로 해석할 경우 MSB가 1이기 때문에 음수를 나타내는 것을 알 수 있고 나머지 비트 0010100은 10진수로 표현하면 20입니다
따라서 부호절대값 방식을 취하면 0b10010100은 -20을 표현한 것입니다

이 방식은 직관적이기 때문에 이해하기 쉽지만 뺄셈 계산을 위한 회로가 따로 필요하기 때문에 비용 및 성능 측면에서 비효율적입니다
예를 들어 8+(-4)=4이라는 식을 일반적으로 계산하면 0b00001000 + 0b10000100 = 0b10001100으로 -12라는 잘못된 값이 도출됩니다
이를 보완한 방식이 아래 1의 보수 방식입니다

1의 보수

1의 보수 방식은 MSB가 1이면 나머지 비트들에 1의 보수를 취합니다
0b10010100을 1의 보수 방식으로 해석해봅시다
MSB가 1이기에 나머지 비트들에 1의 보수를 취하면 나머지 비트들은 0b1101011이 되어 107을 나타냅니다
따라서 1의 보수 방식으로 해석하면 0b10010100은 -107이 됩니다

부호절대값 방식으로 해결하지 못한 8+(-4)=4라는 식도 1의 보수 방식을 사용하면 해결할 수 있습니다
0b00001000 + 0b11111011 = 0b100000011이 나옵니다
비트표현 범위를 넘어선 캐리 0b10b00000011이 나오는데 결과값과 캐리를 더함으로써 0b00000100으로 4가 나오게 됩니다

이처럼 캐리를 결과값에 한번 더 더해야 하는 경우가 있기 때문에 이를 보완한 것이 2의 보수 방식입니다
0b0000b111이 각각 +0과 -0을 나타내기 때문에 0을 표현하는 방식이 두 가지가 되기 때문에 이러한 과정이 필요합니다

2의 보수

1의 보수 방식에서는 MSB가 1일 때 1의 보수를 취했다면 2의 보수 방식에서는 2의 보수를 취합니다
간단하게 말하면 1의 보수를 취하고 1을 더하면 됩니다

8+(-4)를 2의 보수 방식으로 계산해보면 0b00001000 + 0b11111100 = 0b100000100이 됩니다
이번에도 비트 표현을 넘어서는 캐리가 있지만 무시하고 0b00000100만 보면 4가 나오게 됩니다
1의 보수 방식의 단점을 보완할 수 있습니다


일반적으로 부호가 있는 데이터를 표현할 때에는 2의 보수 방식을 사용하기 때문에 0b10010100을 2의 보수 방식으로 해석하면 -108이 되는 것입니다

MSB가 1이기 때문에 음수를 나타내며 아래 비트 0b0010100에 1의 보수를 취한 후 1을 더하면 0b1101100이 되어 108을 나타냅니다
따라서 0b10010100을 2의 보수 방식으로 해석하면 음수인 -108이 되는 것입니다

2025.01.22. 17:44
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기