미분류 항목
[c 언어] 타입캐스팅 ( char 형 음수 값: short 형으로 변환 하기)
하니_즐거운하루
2022. 12. 1. 17:04
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) 으로 꼭집어서 지정해주세요.
그럼 수고하세요.
반응형