我有以下代码
//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并且WIDTH是8,这完全在char的范围内。我已经尝试过将一个WIDTH显式转换为char,但仍然出错。
答案 0 :(得分:14)
您确定char
已签名吗?尝试将字段明确声明为signed char
并查看您获得的内容。
答案 1 :(得分:3)
我猜x >= 0
会导致警告,因为char
可能会被unsigned char
实施。
答案 2 :(得分:3)
char
类型可以是签名或未签名。这取决于您的编译器供应商的选择。甚至可能有一个编译器选项。显然,char
对你来说是无符号的,所以它总是大于或等于零,因此编译器会警告你。
您在此处使用char
来表示“占用最少内存的数字类型”。在这种情况下,我建议明确使用signed char
或unsigned char
。 (尽管char
必须签名或未签名,但每个都与普通char
不同。)保留char
时,您需要保留字符数据。对于数字数据,请使用其他两种类型之一。
答案 3 :(得分:1)
Hummm ...默认情况下不是你的char无符号?在这种情况下,范围将是0-255,这意味着您的&gt; = 0比较将始终为真
答案 4 :(得分:0)
C和C ++标准允许字符类型char有符号或无符号,具体取决于平台和编译器。大多数系统,包括x86 GNU / Linux和Microsoft Windows,都使用signed char,但基于PowerPC和ARM处理器的系统通常使用unsigned char。(29)当在具有不同类型默认值的平台之间移植程序时,这会导致意外结果char。
答案 5 :(得分:0)
试试这个:
typedef struct Point
{
signed char x;
signed char y;
} Point;