메이쁘

[OS][language] signed 와 unsigned 의 차이 간단 비교 정리! 본문

면접 대비 CS지식/else

[OS][language] signed 와 unsigned 의 차이 간단 비교 정리!

메이쁘 2020. 7. 11. 11:14

안녕하세요.

 

C, C++, Java 등 여러 언어에 숫자형 타입으로 쓰이는 Int 가 있습니다.

 

여기에선 또 일반적인 Int 와 unsigned Int 로 나눠져 있습니다.

 

 

이 두 차이는 무엇일까요?

 

 

간단하게 정리해봤습니다.

 

 

 

 

  -  signed : 숫자의 양수, 음수 전부 표현 가능한 값 (부호를 가질 수 있어, 양수인지 음수인지 구분 O)
  -  unsigned : 숫자의 양수만 표현 가능한 값 (부호를 가질 수 없어, 양수인지 음수인지 구분 X)

 

 

 

끝입니다..

 

그럼 원리를 한 번 보겠습니다.

 

 

 

 

 

 

숫자 값을 메모리에 담아두기 위해 int 변수를 선언합니다.

 

그럼, 숫자 10을 메모리에 '10' 이라고 기록할 수 있나요?

 

아뇨. 그렇지 않습니다.

 

 

 

컴퓨터는 0, 1 만 보고 계산한다는 것을 아시나요?

 

그렇기 때문에, 저 숫자 10을 int 변수에 선언한다면, 이후 컴파일 시 메모리에는 10을 2진수로 변환해서 담습니다.

 

 

 

10을 2진수로 변환하면

 

10 -> 1010 이 됩니다.

 

그렇기 때문에, 저희 코드 상에서는 10을 int 변수에 선언했지만 실제 컴파일 할때는 컴퓨터 메모리에 1010 을 담는 것이죠.

 

 

 

 

말이 조금 길어지는데, int는 32bit(4byte) 까지 표현할 수 있는 타입입니다.

 

그래서 int로 표현할 수 있는 숫자의 범위는 -(2^31) ~ 2^31 - 1 ( -2,147,483,648 ~ 2,147,483,647 ) 가 되는 것이구요.

 

 

근데, 32bit 까지 표현할 수 있다면서 왜 가능한 범위는 2의 31 제곱 까지인가요?

 

 

32bit 중 맨 앞에 있는 비트 하나는 부호를 구분하기 위해 쓰이기 때문입니다.

 

이를 MSB(Most Significant Bit) 라고 하는데, 위 처럼 비트가 나열되어 있을 때 최상단 비트 를 가리킵니다.

 *** 반대는 LSB(Least Significant Bit) 라고 합니다.

 

 

최상단 비트를 주로 부호 구분에 사용하기 때문에 MSB 라고 하기도 한다는 거죠.

 

 

 

다시 되돌아와서, 10을 int 변수에 선언했으면 메모리에는 

 

->  0000 / 0000 / 0000 / 0000 / 0000 / 0000 / 0000 / 1010 

 

로 저장됩니다.

 

 

반대로 -10 을 선언했다면 어떻게 저장될까요?

 

->  1000 / 0000 / 0000 / 0000 / 0000 / 0000 / 0000 / 1010 

 

 

 

즉, MSB가 0이면 양수를, 1이면 음수를 나타냅니다.

 

이것이 signed bit 입니다.

 

 

 

그럼 unsigned bit 는 MSB로 부호 구분을 하지 않기 때문에

 

온전히 32bit를 가지고 숫자를 표현할 수 있습니다.

 

그래서 signed 와는 다르게 0 ~ 2^32 - 1 (양수는 대략 2배의 범위) 를 표현할 수 있습니다.

 

 

 

 

 

 

 

원리를 읽으시면서 이해하면 어느순간 머릿속에 깊숙히 담기실 겁니다.

 

 

감사합니다!

 

Comments