'데이터 유형의 제한된 범위로 인해 항상 비교가 사실입니다'경고 c?

StackOverflow https://stackoverflow.com/questions/757482

  •  09-09-2019
  •  | 
  •  

문제

다음 코드가 있습니다

//Point.h
#define WIDTH 8
#define HEIGHT 8

typedef struct Point
{
  char x;
  char y;
} Point;

//Board.c
#include <stdbool.h>

// Some other functions that we don't care about... 

bool inBounds(Point * p)
{
  return p->x >= 0
    && p->x <= WIDTH
    && p->y >= 0
    && p->y <= HEIGHT;
}

이것을 컴파일하면 (PPU-GCC 4.1.1) 다음 경고를받습니다.

warning: comparison is always true due to limited range of data type

char의 범위는 -127 ~ 127이고 너비는 8이지만 숯의 범위 내에 있습니다. 나는 이미 숯으로 너비의 명백한 캐스트를 시도했지만 여전히 오류를 얻었습니다.

도움이 되었습니까?

해결책

당신은 확실합니까? char 서명 되었습니까? 필드를 명시 적으로 선언 해보십시오 signed char 그리고 당신이 얻는 것을보십시오.

다른 팁

나는 추측한다 x >= 0 경고를 유발합니다 char AS로 구현 될 수 있습니다 unsigned char.

그만큼 char 유형이 서명하거나 서명되지 않을 수 있습니다. 컴파일러 공급 업체의 선택에 따라 다릅니다. 컴파일러 옵션도 사용할 수 있습니다. 분명히, char 서명되지 않으므로 항상 0보다 크거나 동일하므로 컴파일러가 경고합니다.

당신은 사용하고 있습니다 char 여기에서 "최소한의 메모리를 차지하는 숫자 유형"을 나타냅니다. 이 경우 명시 적으로 사용하는 것이 좋습니다 signed char 또는 unsigned char. (각각은 평범한 것과 다릅니다 char, 에도 불구하고 char 서명하거나 서명되지 않은 것입니다.) 예비군 char 문자 데이터를 보유 할 때. 숫자 데이터의 경우 다른 두 가지 유형 중 하나를 사용하십시오.

hummm ... 당신의 숯이 기본적으로 부호되지 않았습니까? 이 경우 범위는 0-255입니다. 이는> = 0 비교가 항상 사실이라는 것을 의미합니다.

C 및 C ++ 표준은 플랫폼 및 컴파일러에 따라 문자 유형 Char를 서명하거나 서명하지 못하게합니다. X86 GNU/Linux 및 Microsoft Windows를 포함한 대부분의 시스템은 Signed Char를 사용하지만 PowerPC 및 ARM 프로세서를 기반으로하는 시스템은 일반적으로 서명되지 않은 Char를 사용합니다. (29) 유형에 대해 다른 기본값을 가진 플랫폼간에 프로그램을 포팅 할 때 예상치 못한 결과를 초래할 수 있습니다. 숯.

이 시도:

typedef struct Point
{
  signed char x;
  signed char y;
} Point;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top