"المقارنة هي دائما صحيح بسبب مجموعة محدودة من نوع البيانات" تحذير في ج؟
سؤال
لدي الكود التالي
//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 وعرض 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 يستخدمون Char غير موقعة. (29) يمكن أن يؤدي ذلك إلى نتائج غير متوقعة عند تشغيل برامج المنصات التي لها افتراضيات مختلفة للنوع من شار.
جرب هذا:
typedef struct Point
{
signed char x;
signed char y;
} Point;