« Comparaison est toujours vrai en raison de gamme limitée de type de données » avertissement en C?

StackOverflow https://stackoverflow.com/questions/757482

  •  09-09-2019
  •  | 
  •  

Question

Je le code suivant

//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;
}

Quand je compile ce (4.1.1 ppu-gcc), je reçois l'avertissement suivant

warning: comparison is always true due to limited range of data type

, même si l'intervalle de carbonisation est entre -127 et 127 et la largeur est 8, ce qui est bien à l'intérieur de la gamme d'un caractère. Je l'ai déjà essayé un casting explicite de WIDTH à un char, mais encore eu l'erreur.

Était-ce utile?

La solution

Êtes-vous sûr que char est signé? Essayez de déclarer les champs comme explictly signed char et voyez ce que vous obtenez.

Autres conseils

Je suppose que x >= 0 provoque l'avertissement parce char pourrait être mis en œuvre unsigned char.

Le type de char peut être signé ou non signé. Cela dépend du choix de votre fournisseur de compilateur. Il pourrait même être une option de compilateur disponible. De toute évidence, char est non signé pour vous, il est donc toujours supérieure ou égale à zéro, et donc le compilateur vous avertit.

Vous utilisez char ici pour représenter « un type numérique qui prend la mémoire minimale. » Dans ce cas, je recommande d'utiliser explicitement signed char ou unsigned char. (Chacun d'eux est distinct de char ordinaire, en dépit char avoir à être signé ou non signé.) Réserve char lorsque vous tenez des données de caractère. Pour des données numériques, utilisez l'une des deux autres types.

Hummm ... est pas votre unsigned char par défaut? Dans ce cas, la gamme serait 0-255, ce qui signifie que votre> = 0 comparaison serait toujours vrai

Les normes C et C ++ permet le type de caractères char être signé ou non signé, en fonction de la plate-forme et compilateur. La plupart des systèmes, y compris x86 GNU / Linux et Microsoft Windows, utilisez signed char, mais ceux basés sur les processeurs PowerPC et ARM utilisent généralement unsigned char (29). Cela peut conduire à des résultats inattendus lors du portage des programmes entre les plates-formes qui ont différentes valeurs par défaut pour le type de charbon.

Essayez ceci:

typedef struct Point
{
  signed char x;
  signed char y;
} Point;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top