[C언어] 부호 확장(Sign extension)

  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     char a = -1;  
  6.     unsigned char c = -1;  
  7.     int b = a;  
  8.       
  9.       
  10.     printf("%X\n", b);  
  11.     b = c;  
  12.     printf("%X\n", b);  
  13.     system("pause");  
  14.     return 0;  
  15. }  


결과는 다음과 같다.



int형 b에 같은 -1을 대입했는데 왜 결과 값은 다르게 나올까.

그 이유는 부호 확장에 있다.

int b = a 에서 a는 char 형이기 때문에, 묵시적인 형변환이 발생하게 되는데 이때, char형 데이터인 a를 바로 int형 데이터 b에 넣는 것이 아니라 a를 4바이트 크기로 확장을 하게 된다.

1바이트에서 4바이트로 확장을 하면서 나머지 빈 공간에는 음수면 1로 채우고 양수면 0으로 채우게 된다.

따라서 (signed) char 인 a변수는 앞에 1을 채워서 FFFFFFFF가 되고, unsigned char 인 c변수는 앞에 0을 채워서 FF가 되는 것이다.