1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
 
int main()
{
    unsigned char  uc = -8;
    signed char sc=-8;
    
    printf("unsigned char : %d\n" , uc);    //248
    printf("signed char : %d\n",sc);        //-8
    
    unsigned int  iuc = -1;
    signed int isc=-1;
    
    printf("unsigned int : %d\n" , iuc);    //-1
    printf("signed int : %d\n",isc);        //-1
 
    short ss = 0x8c;
    signed char sc = 0x8c;
    
    printf("%d\n",(int)ss);                    //140
    printf("%x",(int)sc);                    //ffffff8c
    return 0;  
}
cs



 

 unsigned char

signed char

 범위

0~255 

-128~127 

공통점

1byte로 2진수로 표현하면

1000 1000 ->(부호 비트 제외한 2의 보수) 1111 1000

차이점 

부호 비트가 없으므로

248

(128+64+32+16+8)

 첫 번째 비트는 부호 비트로 

1은 음수이므로

-8

(-128+64+32+16+8)


*char 타입은 다른 타입들과 달리 signed/unsigned가 명시되어 있지 않습니다.

그래서 가급적이면 명시를 해서 사용하는 것이 좋습니다.



 

 unsigned int

signed int 

 범위

 0~4294967295

-2147483648~2147483647 

공통점 

4byte로 2진수로 표현하면

1000 0000 0000 0000 0000 0000 0000 00001 

(부호 비트 제외한 2의보수)

1111 1111 1111 1111 1111 1111 1111 1111


*출력 포맷 형식인 %d는 기본적으로 signed int형으로 명시 되어있습니다.

그래서 unsigned int에서 -1을 넣어도 첫 번째 비트를 부호 비트로 인식하여 signed int과 같은 방식으로 처리되어 결과값이 -1이 나옵니다.




*정수의 승격(Integral Promotion)

short ss = 0x8c; 는 0000 0000 1000 1100 입니다.


(int)ss 하면 정수 승격이 발생하여 0000 0000 0000 0000 0000 0000 1000 1100 이 된다.

(이때, short는 2byte이므로 나머지 2byte는 최상위비트로 공간을 채웁니다.)


%d 이고 양수이므로 바로 출력하면 140 이 됩니다.


char sc = 0x8c; 는 1000 1100 입니다.

(int)sc 하면 정수 승격이 발생하여 1111 1111 1111 1111 1111 1111 1000 1100 이 된다.

(이때, char 는 1byte이므로 나머지 2byte는 최상위비트로 공간을 채웁니다.)


%x 이므로 16 진수이므로 바로 출력하면 ffff ff8c 이 된다.


==>될수 있으면 int형을 사용하는 것이 성능면에서 효율적입니다.










+ Recent posts