我有以下代码

//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 charunsigned 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top