: define 문과 char 배열 비교시 주의 사항입니다.
#define BT_SVC_SECURE_DFU 0xFE59 // 기본적으로 define 문은 int 형으로 비교가 됩니다.
unsigned char data[4];
data[0]=0x59;
data[1]=0xFE;
data[2]=0x00;
data[3]=0x00;
>> 위 소스 기준 설명입니다.
1> 예제 1
if(*(unsigned short *)data==BT_SVC_SECURE_DFU)
{
printf("%s(): equal to BT_SVC_SECURE_DFU \r\n", __func__);
}
==> 위 비교는 참입니다. data주소를 unsigned short 형으로 형변환하고 int 형과 비교하면
0x0000FE59 이므로 참.
2> 예제 2
if(*(short *)data==BT_SVC_SECURE_DFU)
{
printf("%s(): equal to BT_SVC_SECURE_DFU \r\n", __func__);
}
==> 위 비교는 거짓입니다. data주소를 short 형으로 변경하면 음수가 되고 값이
0xFFFFE59가 되고 우측 정의값 은 양수이므로 거짓
3> 예제 3
if(*(int *)data==BT_SVC_SECURE_DFU) // OK
{
printf("%s(): equal to BT_SVC_SECURE_DFU \r\n", __func__);
}
==> 위예제는 참입니다. 형변환을 int 형으로 했으므로 data[0] ~data[3] 값을 사용하므로
0x0000FE59 가 되므로 참
4> 예제 4
if(*(short *)data==(short)BT_SVC_SECURE_DFU) // OK
{
printf("%s(): equal to BT_SVC_SECURE_DFU \r\n", __func__);
}
==> 위 예제도 참입니다. define 문의 값을 short 형으로 변경하면 음수 0xFE59가 되고
좌측 값도 short 형으로 형변환하면 0xFE59 값은 음수가 되므로 참입니다.
이 예제에서 알아야 할 내용은 최상위 비트가 0인지 1인지에 따라 비교시
제가 원하지 않는 결과가 나올수도 있다는 것입니다.
음수 양수 상관없이 비교하려면 unsigned 형으로 변환해 주세요.
추후 형변환 및 비교시 참고하세요.