본문 바로가기
C++/기초

C++ 기초 : 정수형 자료형

글: 시플마 2024. 2. 2.

unsigned를 붙인 char형 변수가 나타낼 수 있는 수의 범위는 0 ~ 255 입니다.

 

unsigned를 붙인 char형 변수가 나타낼 수 있는 수의 범위는 0 ~ 255 이다.

 

 

unsigned를 붙인 char형 변수가 나타낼 수 있는 수는 256가지입니다.

unsigned를 붙이지 않은 경우 음수까지 표현해야 합니다. 

음수에서 128가지, 양수에서 128가지 수를 표현할 수 있는 것이죠.

이에 대해 자세하게 따져 보도록 하겠습니다.

 

0 0 0 0 0 0 0 0

 

일반적으로 변수를 선언하면 가장 왼쪽에 있는 비트는 MSB입니다. 풀어서 쓰면 Most Significant Bit로 최상위 비트입니다.

singed char형(char형으로 선언할 경우 signed char형을 의미한다.)에서 MSB의 역할은

해당 수가 양수인지, 음수인지 결정하는 역할입니다.

MSB가 0이면 양수이고 1이면 음수임을 의미합니다.

 

MSB가 한 비트를 차지하고 있으므로 나머지 7칸을 통해서 수를 표현해야 합니다.

7칸이므로 2의 7제곱만큼 표현할 수 있습니다.

0을 포함해서 양수에서 128가지, 음수에서 128가지의 수를 표현할 수 있는 것입니다.

수의 범위는 양수에서 0 0 0 0 0 0 0 0 ~ 0 1 1 1 1 1 1 1로 0 ~ 127입니다.

음수에서 1 0 0 0 0 0 0 0 ~ 1 1 1 1 1 1 1 1로 -128 ~ -1입니다.

(참고로 0은 양수도 음수도 아닙니다. 이해를 위해 0을 양수 범위에 포함시켰습니다.)

 

여기서 주의할 점이 있습니다. MSB가 1이고 나머지 칸이 1을 나타내고 있을 때 -1이라고 생각할 수 있다는 점입니다.

1 0 0 0 0 0 0 1

 

그러나 이는 맞지 않습니다. 컴퓨터에서 음수의 개념은 일반적인 경우와 다르게 접근해야 합니다.

여기 5 - 5 = 0 이라는 수식이 있습니다.

이는 5 + (-5) = 0 으로 바꿀 수 있습니다.

위 수식에서 음수 -5 는 5 를 0 으로 만드는 수입니다.

컴퓨터에서도 마찬가지입니다.

 

예를 들어 설명해 보겠습니다.

0 1 1 1 1 1 1 1

 

위 그림은 MSB가 0 이고 나머지 7칸이 1 로 채워져 있으므로 127 입니다. 

그렇다면 127, 즉 0 1 1 1 1 1 1 1 을 0 으로 만드는 수는 무엇일까요?

 

0 1 1 1 1 1 1 1

 

+

? ? ? ? ? ? ? ?

 

0 0 0 0 0 0 0 0

 

 

 

물음표에 들어갈 수는 

1 0 0 0 0 0 0 1

 

위와 같을 것입니다.

 

 

직접 계산해 보면                  

0
1 1 1 1 1 1 1

 

+

1 0 0 0 0 0 0 1

 

1 0 0 0 0 0 0 0 0

 

위와 같은 결과가 나옵니다.

0 1 1 1 1 1 1 1 과 1 0 0 0 0 0 0 1 을 더하다 보면 char형 변수가 나타낼 수 있는 8칸(8bit)을 넘은 1 이 그대로 사라지고

남은 8칸이 모두 0으로 채워집니다. 127에서 어떤 수를 더했는데 결과가 0 이 되었습니다. 여기서 어떤 수는 -127이 겠죠?

127인 0 1 1 1 1 1 1 1 에서 더했을 때 0 으로 만드는 1 0 0 0 0 0 0 1 은 -127인 것입니다.

 

 

결과적으로

1 0 0 0 0 0 0 1

 

위 그림은 -1이 아닌 -127인 것이죠.

 

그렇다면 이제 -1은 어떻게 표현하는지 알 수 있습니다.

 

0
0 0 0 0 0 0 1

 

위 그림은 1을 표현한 것입니다. 이것을 0 으로 만들어 주는 수를 찾으면 됩니다.

 

 

0
0 0 0 0 0 0 1

 

+

1
1 1 1 1 1 1 1

 

=

1 0
0 0 0 0 0 0 0

 

 

위 결과를 살펴보면 char형 변수가 나타낼 수 있는 8칸(8bit)의 범위를 넘은 1 은 사라지고

나머지 7칸이 0 으로 채워진 결과가 나왔습니다.

1 1 1 1 1 1 1 1 은 -1임을 알 수 있습니다.

1
1 1 1 1 1 1 1

 

 

여기서 재밌는 점이 있습니다.

int main() {
	unsigned char c = 0;
	c = 255;
	
	char c1 = 0;
	c1 = 255;
	return 0;
}

 

unsigned char형으로 선언한 변수 c와 char형으로 선언한 c1이 있습니다.

0 ~ 255의 수를 수용할 수 있는 변수 c는 255를 대입할 수 있을 것입니다.

그렇다면 -128 ~ 127까지의 수를 수용할 수 있는 변수 c1에 255를 대입하면 어떻게 될까요?

 

 

위와 같이 코드를 입력하고 확인해 보겠습니다.

unsigned char형으로 선언한 변수 c에 255를 대입하자 255가 그대로 대입되었다.

 

 

unsigned char형으로 선언한 변수 c에 255를 대입하자 255가 그대로 대입되었습니다.

최대 255의 수까지 표현할 수 있기 때문이죠.

 

char형으로 선언한 변수 c1에 255를 대입하였을 때는 어떨까요?

char형으로 선언한 변수 c1에 255를 대입하자 -1로 인식되었다.

 

변수 c1에는 -1로 인식이 됩니다. c1은 표현할 수 있는 최댓값이 127이기 때문에 255는 수용할 수 없습니다. 

그렇다면 왜 -1로 인식이 되는 것일까요?

 

대입한 255는 아래와 같이 8bit 모두 1로 채워진 모습입니다.

1
1 1 1 1 1 1 1

 

 

그러나 변수 c1은 음수도 표현할 수 있기 때문에 가장 왼쪽에 있는 비트는 MSB로 인식합니다.

1
1 1 1 1 1 1 1

 

 

위 그림은 어디서 많이 봤습니다. 네, 맞습니다. 방금 전에 우리가 계산한 -1 과 같은 모습이죠.

-1이 어떻게 표현되는지 알기 위해 1을 0으로 만드는 수를 찾았었다.

 

여기서 알 수 있는 점은 변수 c와 변수 c1의 비트 상태는 같을 것입니다.

255(1 1 1 1 1 1 1 1) 라는 같은 수를 대입했으니 당연합니다.

그러나 변수의 자료형에 따라 같은 값이라도 다르게 해석될 여지가 있다는 것입니다.

 

또한 unsigned char형으로 선언된 변수 c에 -1을 대입하면 255로 인식이 되는데 같은 원리입니다.

unsigned char형으로 선언된 변수 c에 -1을 대입하면 255로 인식된다.

 


 

 

양수에 대응하는 음수를 찾기 위해 계산하는 것은 꽤 번거로운 일입니다.

그래서 조금 더 간단하게 알아낼 수 있는 방법이 있는데요, 이 방법을 2의 보수법이라고 합니다.

 

-2를 어떻게 표현하는지 알아보면서 설명하겠습니다.

-2를 알기 위해서는 먼저 십진수인 2를 이진수로 바꾸어 표현합니다.

0
0 0 0 0 0 1 0

 

이 상태에서 모든 비트를 반전시킵니다. 0은 1로 1은 0으로 말이죠.

 

 

1
1 1 1 1 1 0 1

 

그리고 마지막으로 1을 더합니다. 

 

 

1
1 1 1 1 1 1 0

 

위와 같은 상태가 바로 -2입니다. 맞는지 계산해 보겠습니다.

 

 

0
0 0 0 0 0 1 0

 

+

1
1 1 1 1 1 1 0

 

=

1 0
0 0 0 0 0 0 0

 

char형의 범위를 넘어가 사라지는 1을 제외하면 나머지 비트가 0으로 채워졌습니다.

1 1 1 1 1 1 1 0는 0 0 0 0 0 0 1 0(2)를 0 0 0 0 0 0 0 0으로 만드는 값이므로 -2가 맞는 것을 확인할 수 있습니다.

 


 

 

 

signed로 선언되는 변수는 MSB로 부호를 결정합니다. 이를 인지하고 사용해야 합니다.

예를 들어 게임을 만든다고 가정하겠습니다. 보스의 체력을 int형(4byte, 즉 32bit이다.)으로 관리한다고 했을 때

보스가 가질 수 있는 체력의 범위는 2의 32제곱이므로 -2,147,483,648 ~ 0 ~ 2,147,483,647입니다. 

일반적으로 보스가 살아있는 상태라면 체력이 양수일 겁니다. 즉 MSB가 반드시 0인 상태여야 하는 것입니다.

여기서 보스가 가질 수 있는 최대 체력은 2,147,483,647입니다.

이는 MSB를 제외하면 나머지 비트들은 모두 1로 채워진 상태일 겁니다. ( 0 1 1 1 1 1 1 .......)

만약 11억의 체력을 가진 보스가 업데이트 되었고, 그 보스가 체력을 두 배 증가시키는 스킬을 사용하면 어떻게 될까요? 

int형으로 선언한, 보스 체력을 관리하는 변수의 수가 올라가다가 2,147,483,647이 넘어가는 순간, MSB가 1이 되는 상황이 오게 됩니다. 그렇게 되면 순식간에 보스 체력이 음수가 되어 문제가 생기게 되겠죠.

 

아무튼 이번 개념을 통해 기본적으로 스타크래프트에서 최대 업그레이드 가능 횟수가 255인 것은 업그레이드 관련 변수가 uinsigned char형이고 최대 공격력이 65,536인 것은 공격력 관련 변수가 unsigned short형이라는 것을 예상해 볼 수 있습니다.

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB

 


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 논리 연산자  (0) 2024.02.09
C++ 기초 : 증감 연산자  (0) 2024.02.06
C++ 기초 : 산술 연산자  (0) 2024.02.06
C++ 기초 : 실수형 자료형  (0) 2024.02.06
C++ 기초 : 자료형  (0) 2024.02.01