2009-04-16 3 views
5

나는 다음과 같은 코드가 난이 (PPU-GCC 4.1.1)를 컴파일하면'C에서 경고가 나타나는 데이터 유형의 제한된 범위 때문에 항상 비교가 가능합니까?

//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; 
} 

, 나는 다음과 같은 경고를받을 문자의 범위는 -127 (127)에 비록

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

WIDTH는 8입니다. 이는 char의 범위 내에 있습니다. 이미 char에 WIDTH를 명시 적으로 시도했지만 오류가 발생했습니다.

+0

은 int로 당신의 구조체를 변경하고, 무슨 일이 생긴 것을 볼 수? –

+0

귀하의 경우에는 x와 y에 대해 atoi 또는 static cast를 수행 한 다음 높이와 너비와 비교해야합니다. –

답변

14

char에 서명 했습니까? 명시 적으로 필드를 signed char으로 선언하고 얻은 결과를 확인하십시오.

+0

그래, 나는 char가 unsigned라고 믿는다. 그래서 항상 0과 비교된다. – Wedge

+13

컴파일러에 따라 다릅니다. 서명해야 할 char가 필요하면 서명 된 것으로 선언해야합니다. –

+0

그래, 고쳐. 그러나 오류가 발생하는 행은 양수 (WIDTH 및 HEIGHT)와 비교하는 행이었습니다. 이상한. –

1

Hummm ... 기본적으로 서명되지 않은 char입니다. 이 경우 범위는 0-255가되므로 0보다 큰 값을 비교하면 항상 맞을 것입니다.

+1

플랫폼 및 컴파일러에 따라 다릅니다. 예를 들어 x86 Linux의 GCC는 기본적으로 signed char를 사용하고 PowerPC Linux의 GCC는 기본적으로 unsigned char을 사용합니다. – ephemient

3

x >= 0charunsigned char으로 구현 될 수 있으므로 경고가 발생합니다.

3

char 유형은 서명 또는 서명되지 않을 수 있습니다. 컴파일러 공급 업체의 선택에 따라 다릅니다. 컴파일러 옵션을 사용할 수도 있습니다. 분명히 char은 서명되지 않았으므로 항상 0보다 크거나 같기 때문에 컴파일러가 경고합니다.

여기서 "최소 메모리를 차지하는 숫자 유형"을 나타 내기 위해 char을 사용하고 있습니다. 이 경우 명시 적으로 signed char 또는 unsigned char을 사용하는 것이 좋습니다. (각각 charchar이 서명되었거나 서명되지 않은 것이어야 함에도 불구하고) char 문자 데이터를 보유하고있는 경우를 대비하여 예약하십시오. 숫자 데이터의 경우 다른 두 가지 유형 중 하나를 사용하십시오.

+1

확인 : http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html – dfa

0

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

0

이 시도 :

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