"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل "char" و"signed char" و"unsigned char" متميزون حقًا في لغة C++؟

هل "char" و"signed char" و"unsigned char" متميزون حقًا في لغة C++؟

تم النشر بتاريخ 2024-11-05
تصفح:553

  Are `char`, `signed char`, and `unsigned char` Truly Distinct in C  ?

أنواع الأحرف في لغة C: مميزة أم مكافئة؟

في لغة C، قد يختلف سلوك أنواع الأحرف (char) أحيانًا عن سلوك أنواع الأحرف الأعداد الصحيحة الموقعة وغير الموقعة، مما يؤدي إلى الارتباك. على وجه التحديد، يوضح التعليمة البرمجية التالية هذا الاختلاف:

#include 

typedef   signed char       int8;
typedef unsigned char      uint8;

struct TrueType {};
struct FalseType {};

template 
struct isX
{
   typedef typename T::ikIsX ikIsX;
};

template             struct isX  { typedef FalseType ikIsX; };
template             struct isX  { typedef FalseType ikIsX; };
template             struct isX  { typedef FalseType ikIsX; };

template  bool getIsTrue();
template            bool getIsTrue() { return true; }
template            bool getIsTrue() { return false; }

int main(int, char **t )
{
   cout ::ikIsX  >() ::ikIsX  >() ::ikIsX  >()  

يتم تجميع هذا الرمز ولكنه ينتج نتائج مختلفة لـ char مقارنة بـ int8 و uint8. وذلك لأن لغة C تتعامل مع char وsigned char وunsigned char كثلاثة أنواع مختلفة.

في المقابل، int وuint32 هما نوعان متكافئان:

template             struct isX  { typedef FalseType ikIsX; };
template             struct isX  { typedef FalseType ikIsX; };

ينبع هذا التمييز من حقيقة أن char تم استخدامه تاريخيًا لتمثيل الأحرف وتخزين القيم الرقمية. ونتيجة لذلك، تحافظ لغة C على التوافق مع الإصدارات السابقة من خلال التعامل مع الحرف العادي كنوع منفصل، يختلف عن int.

لتحديد أي من التمثيلين يستخدم char، فإن typedef المحدد بالتنفيذ char_traits::signed هو متاح. إذا كان هذا صحيحاً، يتصرف char كنوع موقّع؛ وإلا فإنه يتصرف كنوع غير موقع.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3