'由于C中的数据类型范围有限,'比较总是如此?

时间:2009-04-16 18:36:30

标签: c gcc cell warnings

我有以下代码

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

6 个答案:

答案 0 :(得分:14)

您确定char已签名吗?尝试将字段明确声明为signed char并查看您获得的内容。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

您在此处使用char来表示“占用最少内存的数字类型”。在这种情况下,我建议明确使用signed charunsigned 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;