컴퓨터 구조

비트 계산식 (2의 보수법)

JiHxxn 2024. 6. 10. 18:50

🤔 signed와 unsigned 이란?

signed 와 unsigned를 쉽게 말하자면 음수부터 2^8승 크기의 숫자를 나타낼 것 인지, 아니면 0부터 2^8승 크기의 숫자를 나타낼 것 인지의 차이이다.

언어마다 uint로 줄여 표현하기도 하며, 양수만 저장할 수 있는 uint는 일반 int에 비해 플러스 범위의 정수에 대해 2배 큰 범위까지 저장할 수 있다.

이는 양의 정수 범위만 필요한 나이, 물건의 수, 레벨 등에 많이 쓰인다.

자료형 저장할 수 있는 값의 범위 크기

UInt8 0 ~ 255 8bit
UInt16 0 ~ 65,535 16bit
UInt32 0 ~ 4,294,967,295 32bit
UInt64 0 ~ 18,446,744,073,709,551,615 64bit

🤔 비트의 음수, 양수 구별법

signed에서는 음수냐 양수냐를 판단할 때는 MSB를 보고 판단한다. 부호를 판단할 때 MSB가 0일 땐 양수, MSB가 1일 땐 음수를 뜻한다.

MSB란 비트가 8의 배수로 나열되어 있을 때 가장 왼쪽에 있는 최상위 비트를 MSB(Most Significant Bit)라고 부른다.

반대로 최하위 비트 LSB(Least Significant Bit)는 가장 왼쪽에 있다.

MSB LSB

1 0 0 0 0 0 0 0

반면 unsigned는 0000000000에서 11111111을 모두 양수로 표현한다.


🤔 음의 비트를 구하는 법(2의 보수법)

음의 비트를 구하기 위해선 양수에서 더해서 0이 나오는 수를 구하면 된다.

ex. -127 비트를 구하기 위해선 양수 127 비트에서 더해서 0이 나오게 하면 그 수가 -127이다

0 1 1 1 1 1 1 1

1 0 0 0 0 0 0 1

=

0 0 0 0 0 0 0 0

→ -127은 10000001이다

이를 쉽게 구하는 방법이 [2의 보수법]이다.

  • 양수 비트에서 완전 반전 시킨 후 1만 더 더해주면 음수를 구할 수 있다.

ex. -2를 구하기 위해 2(00000010)에서 반전 시킨 후 1을 더한 값이 -2이다

0 0 0 0 0 0 1 0

1 1 1 1 1 1 1 0

=

0 0 0 0 0 0 0 0


🤔 signed 와 unsigned의 값 표현 방식

unsigned char c = 255;
char c1 = 255;

위 코드를 보면 양수만 표현할 수 있는 c와 달리 c1은 음수 양수 둘 다 표현하기 때문에 255를 담지 못한다. 이때 c와 c1의 비트 상태는 같을까?

정답은 양쪽 다 11111111로 같다.

물론 값은 c에는 255, c1에는 -1이 담겨 있다.

관점의 차이인데, 양수의 관점에서 보았을 땐 255지만, 음수의 관점에선 -1이다.

이유는 양수만 넣을 수 있는 변수에서 255를 넣겠다는 것은 모든 비트를 11111111로 넣겠다는 뜻이고,

음수만 넣을 수 있는 변수는 음수의 관점에선 MSB를 보고 판단해 -1로 판단한다.

이유는 1(00000001)을 더했을 때 0이 되기 때문이다.