9

我有以下代码

//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,但仍然出现错误。

4

6 回答 6

16

你确定char是签名的?尝试将字段明确声明为signed char,看看你得到了什么。

于 2009-04-16T18:42:36.480 回答
4

我猜x >= 0会导致警告,因为char可能被实现为unsigned char.

于 2009-04-16T18:47:21.273 回答
3

char类型可以是有符号或无符号的。这取决于您的编译器供应商的选择。甚至可能有一个可用的编译器选项。显然,char对你来说是无符号的,所以它总是大于或等于零,因此编译器会警告你。

您在char这里使用来表示“占用最少内存的数字类型”。在这种情况下,我建议明确使用signed charor unsigned charchar(尽管char必须签名或未签名,但每个都与 plain 不同。)char为您保存字符数据时保留。对于数值数据,请使用其他两种类型之一。

于 2009-04-16T18:54:33.457 回答
1

嗯......默认情况下你的char不是无符号的吗?在这种情况下,范围为 0-255,这意味着您的 >=0 比较将始终为真

于 2009-04-16T18:43:03.343 回答
0

C 和 C++ 标准允许字符类型 char 有符号或无符号,具体取决于平台和编译器。大多数系统,包括 x86 GNU/Linux 和 Microsoft Windows,都使用有符号字符,但基于 PowerPC 和 ARM 处理器的系统通常使用无符号字符。(29) 当在具有不同类型默认值的平台之间移植程序时,这可能会导致意外结果的字符。

于 2011-04-07T22:27:13.773 回答
0

试试这个:

typedef struct Point
{
  signed char x;
  signed char y;
} Point;
于 2015-04-10T16:57:00.220 回答