본문으로 바로가기

: 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 형으로 변환해 주세요.

 

추후 형변환 및 비교시 참고하세요.

 

 

 

 

반응형