“比较永远为真,由于数据类型范围限制”在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;
}
当我编译此(PPU-GCC 4.1.1),得到以下的警告
warning: comparison is always true due to limited range of data type
即使炭的范围是-127到127和宽度为8,这是一个良好炭的范围内。我已经试过宽度的显式转换为char,但仍然得到了错误。
解决方案
您确定char
签署?尝试显式声明领域signed char
,看看你会得到什么。
其他提示
我想x >= 0
使警告,因为char
还不如unsigned char
来实现。
在char
类型可以有符号或无符号的。这取决于你的编译器供应商的选择。甚至有可能提供一个编译器选项。显然,char
是无符号的为你,所以它总是大于或等于零,从而,编译器会发出警告。
您正在使用char
在这里代表“数字类型,占用的内存。”在这种情况下,我建议明确使用signed char
或unsigned char
。 (每一个都是从普通char
不同,尽管有被符号或无符号char
。)储备char
当你持有的字符数据。对于数字数据,使用其他两种类型之一。
Hummm ......是不是你的char默认无符号?在这种情况下,范围将是0-255,这意味着你> = 0的比较。将总是为真
C和C ++标准允许字符类型char到取决于平台和编译器上有符号或无符号的。大多数系统,包括x86 GNU / Linux和Microsoft Windows,使用符号的字符,但那些基于PowerPC和ARM处理器通常使用无符号的字符。(29)移植具有不同的默认值类型的平台之间的程序时,这可能导致意外的结果的炭。
尝试这种情况:
typedef struct Point
{
signed char x;
signed char y;
} Point;
不隶属于 StackOverflow