본문으로 바로가기

1> 기본지식

  : char 형은 unsigned 도 되고 signed 도 될수 있으니 가능하면 앞에 부호를 넣어주면 좋습니다.

void main()
{
    char ch;
    short sh;
    int in;
    long lo;
    NRF_LOG_INFO("Size :: char=%d, short=%d , int=%d, long=%d",sizeof(ch),sizeof(sh), sizeof(in), sizeof(lo));
}

>> 결과값

Size :: char=1, short=2 , int=4, long=4

>>  컴파일러/OS 에 따라 int, long 크기는 달라집니다. 저는 Nordic 에 SES 사용시  4 bytes 로 나오네요.

    char :1 byte ,

    short :2bytes

    int , long: 4bytes

 

#include <limits.h>
unsigned char u_ch=0xfe;
char ch=0xfe;
signed char s_ch=0xfe;
NRF_LOG_INFO("ch=0x%x,u_ch=0x%x , s_ch=0x%x",ch,u_ch, s_ch);
NRF_LOG_INFO("CHAR_MIN(%d),SCHAR_MIN(%d)", CHAR_MIN,SCHAR_MIN);

>> 결과값
 ch=0xFE,u_ch=0xFE , s_ch=0xFFFFFFFE
 CHAR_MIN(0),SCHAR_MIN(-128)

  >> 위 내용에서 알수 있는것은 char 형이 unsigned char형으로  된다는점입니다.

     CHAR_MIN 값이 0 인지 확인해도 됩니다.

 

위의 내용을 바탕으로 short 형도 확인해 보겠습니다..

short sh=-1;
signed short s_sh=-1;
unsigned short u_sh=-1;

NRF_LOG_INFO("sh=0x%x,u_sh=0x%x , s_sh=0x%x",sh,u_sh, s_sh);


>>> 결과값 <<<<
sh=0xFFFFFFFF,u_sh=0xFFFF , s_sh=0xFFFFFFFF

>> 위 결과로 판단하면  short 형은 signed short 형으로 되어 있네요.

 

 

 

 

2>  그럼 결론적으로 음수 char 형인 signed char 형을 short 형으로 타입 캐스팅하면 되겠네요.

   

unsigned char u_ch=-1;
char ch=-1;
signed char s_ch=-1;

short sh, s_sh, u_sh;
sh =(signed char) s_ch;
s_sh =(signed char) ch;
u_sh = (char)ch;     // unsigned char 형 short 형 변환시 상윗바이트는 0으로 들어갑니다.
NRF_LOG_INFO("sh=0x%x,u_sh=0x%x , s_sh=0x%x",sh,u_sh, s_sh);

>>>>>>>>>   결과값
sh=0xFFFFFFFF,u_sh=0xFF , s_sh=0xFFFFFFFF

 

 < 주의 >

sh = (char)ch;		//unsigned char 형으로 변환 하니 음수 처리 안됨.
NRF_LOG_INFO("sh=0x%x",sh);

>>> 결과 값
sh=0xFF
unsigned char u_ch=0xfe;    // -2
short sh;
sh =(signed char)u_ch;
NRF_LOG_INFO("u_ch=%d,  sh=%d",u_ch,sh);
NRF_LOG_INFO("u_ch=%d,  sh=%d",(signed char)u_ch,sh);   // print 문 변수 타입캐스팅


>>> 결과값
u_ch=254,  sh=-2
u_ch=-2,  sh=-2

  >> 타입캐스팅시 signed 타입을 적용하고 대입하는 변수가 signed 타입이면 

       unsigned char 형 타입이라고 해도 signed short 형으로 변환 가능합니다.

 

char 형이 signed 인지 모르셨다면  다음처럼 무식하게 코딩으로  메꿀수도 있습니다.

unsigned data[2];
short x_delta, y_delta;
~~~~ bla bla~~~~

if(data[0] & 0x80)
    x_delta = (0xff<<8)|data[0];
else
    x_delta =data[0];

if(data[1] & 0x80)
    y_delta = (0xff<<8)|data[1];
else
    y_delta =data[1];
    
    
--------> 동일내용의 대체 코드   <----------
x_delta=(signed char)data[0];
y_delta=(signed char)data[1];

   

 

< 결론>

  char 형은 꼭 타입을 확인하고 , 혹시 모르겠으면 타입캐스팅을 (signed char) 으로 꼭집어서 지정해주세요.

 

 

 

그럼 수고하세요.

 

반응형