tags:

views:

1458

answers:

4

I have the following code

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

When I compile this (ppu-gcc 4.1.1), I get the following warning

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

even though the range of char is -127 to 127 and WIDTH is 8, which is well inside the range of a char. I've already tried an explicit cast of WIDTH to a char, but still got the error.

+9  A: 

Are you sure that char is signed? Try declaring the fields explictly as signed char and see what you get.

Dan Breslau
Yeah, I believe char is unsigned, so it's the comparison to 0 that will always be true.
Wedge
It's compiler-dependent. If you *need* char to be signed, you need to declare it as signed.
Dan Breslau
Yeah this, fixes it. However, the lines that I was getting an error on were the lines where I was making a comparison against positive numbers (the WIDTH and HEIGHT). Strange.
Paul Wicks
The compiler must be using 0-based line numbers :-) Actually, you may have a different problem there: Using <= and >= means that you have an effective WIDTH and HEIGHT range of 9, not 8. If that's what you want, perhaps you should use different macro names (MAX_X and MAX_Y?)
Dan Breslau
+1  A: 

Hummm... isn't your char unsigned by default? In that case the range would be 0-255, which means your >=0 comparison would be always true

Varkhan
It's platform- and compiler-dependent. For example, GCC on x86 Linux uses signed char by default, while GCC on PowerPC Linux uses unsigned char by default.
ephemient
+3  A: 

I guess x >= 0 causes the warning because char might be implemented as unsigned char.

Daniel Brückner
+1  A: 

The char type may be signed or unsigned. It depends on your compiler vendor's choice. There might even be a compiler option available. Evidently, char is unsigned for you, so it's always greater than or equal to zero, and thus the compiler warns you.

You're using char here to represent "a numeric type that takes up minimal memory." In that case, I recommend explicitly using signed char or unsigned char. (Each is distinct from plain char, despite char having to be either signed or unsigned.) Reserve char for when you're holding character data. For numeric data, use one of the other two types.

Rob Kennedy
this is confirmed by: http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html
dfa