'''
부호 비트
부호가 있는 데이터의 경우, MSB는 부호의 의미를 가지게 됩니다. MSB가 0이면 양수, 1이면 음수를 나타냅니다. 프로그래밍 언어에서 부호(+, -)를 가지는 데이터는 Signed 데이터 또는 부호가 있는 데이터라 부르고, 부호없이 양수(+)만 나타내는 데이터는 unsigned 데이터 또는 부호가 없는 데이터라 부릅니다.
예를 들어 앞서 살펴본 0b10010100가 부호가 있는 데이터라면, MSB가 1이기 때문에 10진수로 표현하면 음수인 -108이 됩니다.
반면에 부호가 없는 데이터라면, MSB인 1은 부호를 의미하지 않고, 값을 의미하므로 양수인 148이 됩니다.
'''
에서 부호가 있는 데이터 일 때 MSB가 1이기 때문에 10진수로 표현하면 음수인 -108이라는 게 이해가 안갑니다.. 왜 갑자기 108이 나온거죠..?
부호가 없는 데이터는 음수를 표현하지 못합니다
음수를 표현하기 위해서는 부호 비트가 필요한데 표현 방법으로는 부호절대값(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
이 나옵니다
비트표현 범위를 넘어선 캐리 0b1
과 0b00000011
이 나오는데 결과값과 캐리를 더함으로써 0b00000100
으로 4가 나오게 됩니다
이처럼 캐리를 결과값에 한번 더 더해야 하는 경우가 있기 때문에 이를 보완한 것이 2의 보수 방식입니다
0b000
과 0b111
이 각각 +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이 되는 것입니다