"المقارنة هي دائما صحيح بسبب مجموعة محدودة من نوع البيانات" تحذير في ج؟

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

  •  09-09-2019
  •  | 
  •  

سؤال

لدي الكود التالي

//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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top