C 언어에 기호가 없는 것과 기호가 있는 것 사이의 연산 문제

int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))

int main(void)
{
    int d = -1, x;
    /* ... */

    if (d <= TOTAL_ELEMENTS - 2)
        x = array[d+1];
    /* ... */
}

상기 코드에 대해if분기는 실행되지 않습니다. 즉if표현식의 값은 가짜입니다.원인은 토탈ELEMENTS가 정의하는 값은 unsigned int 유형(sizeof()의 반환 유형은 기호 수가 없기 때문입니다.if 문장은signed int와 unsigned int 사이에서 상등성을 테스트하기 때문에 d는 unsigned int 형식으로 업그레이드됩니다. -1은 unsigned int로 변환된 결과는 매우 큰 정수로 표현식의 값을 가짜로 만들 것입니다.이 문제를 해결하려면 토탈에게만ELEMENTS 강제 유형 변환:if (d <=(int) TOTALELEMENTS - 2)
무기호 형식에 대해: 코드에 무기호 형식을 사용하지 마십시오. 불필요한 복잡성을 증가시키지 않도록 합니다. 특히 무기호 수에 마이너스 값이 존재하지 않기 때문에 그것으로 수량을 표시하지 마십시오.가능한 int와 같은 기호 형식을 사용합니다. 이렇게 하면 혼합 형식의 복잡한 디테일을 업그레이드할 때 경계 상황을 걱정할 필요가 없습니다.비트 세그먼트와 바이너리 마스크를 사용할 때만 무기호 수를 사용할 수 있으며, 표현식에서 강제 형식 변환을 사용해서 조작 수가 모두 무기호 수나 무기호 수로 만들어야 한다. 그러면 컴파일러가 결과의 유형을 선택할 필요가 없다.

좋은 웹페이지 즐겨찾기