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와 같은 기호 형식을 사용합니다. 이렇게 하면 혼합 형식의 복잡한 디테일을 업그레이드할 때 경계 상황을 걱정할 필요가 없습니다.비트 세그먼트와 바이너리 마스크를 사용할 때만 무기호 수를 사용할 수 있으며, 표현식에서 강제 형식 변환을 사용해서 조작 수가 모두 무기호 수나 무기호 수로 만들어야 한다. 그러면 컴파일러가 결과의 유형을 선택할 필요가 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
사업의 규격을 세금 신고서 스타일로 만들어 보았다계산 공식을 해석기로 조작하는 과정에서 취미를 어떻게 표현하면 쉽게 알아볼 수 있고 이해하기 쉬운지 머리를 쥐어짜면서 생각했다. 이 상황에서 그 동작의 조합.세무신고서 쓰면 비슷해!!눈치챘을 때의 물건이다. 그 복잡...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.