비트 계산식 (2의 보수법)
🤔 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이 되기 때문이다.