سؤال

في كتاب "المرجع الكامل للC" وذكر أن char هو افتراضيا غير الموقعة.

ولكن انا تحاول التحقق من ذلك مع دول مجلس التعاون الخليجي وكذلك برنامج Visual Studio. ومن أخذه ك <م> قعت افتراضيا.

واحد الذي هو الصحيح؟

هل كانت مفيدة؟

المحلول

وهذا الكتاب هو الخطأ. لا يحدد المعيار إذا وقع char عادي أو غير موقعة.

في الواقع، ويعرف القياسية ثلاثة أنواع متميزة: char، signed char، وunsigned char. إذا كنت #include <limits.h> وبعد ذلك ننظر في CHAR_MIN، يمكنك معرفة ما إذا كان char سهل هو signed أو unsigned (إذا CHAR_MIN أقل من 0 أو يساوي 0)، ولكن حتى ذلك الحين، و<م> ثلاثة أنواع هي متميزة كما فيما يتعلق المعيار.

هل لاحظ أن char هو خاص في هذا السبيل. إذا قمت بتعريف المتغير كما int هو 100٪ أي ما يعادل معلنا أنها signed int. هذا هو دائما صحيحا بالنسبة لجميع المجمعين وأبنية.

نصائح أخرى

نقاط ألوك من ، ويترك القياسية التي تصل إلى التنفيذ.

لدول مجلس التعاون الخليجي، وقعت الافتراضي، ولكن يمكنك تعديل ذلك مع <لأ href = "https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/C-Dialect-Options.html# funsigned-شار مؤشر "يختلط =" noreferrer نوفولو "> -funsigned-char . <ط> ملاحظة: لدول مجلس التعاون الخليجي في الروبوت NDK، الافتراضي هو غير الموقعة . يمكنك أيضا أن تطلب صراحة لشخصيات الموقعة مع <لأ href = "https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/C-Dialect-Options.html#index-fsigned-char" يختلط = "noreferrer نوفولو"> -fsigned-char .

في MSVC، توقيع افتراضي ولكن يمكنك تعديل ذلك مع <لأ href = "https://docs.microsoft.com/en-us/cpp/build/reference/j-default-char-type-is -unsigned "يختلط =" noreferrer نوفولو "> /J .

C99 N1256 مشروع 6.2.5 / 15 "أنواع" وهذا القول عن نيس موقعة من نوع char:

<اقتباس فقرة>   

وتنفيذ يجب تحديد شار أن يكون نفس النطاق، والتمثيل، والسلوك كما شار إما بالتوقيع أو الحرف غير الموقعة.

ووفي حاشية:

<اقتباس فقرة>   

وCHAR_MIN المحددة في <limits.h>، وسوف يكون واحدا من 0 القيم أو SCHAR_MIN، وهذا يمكن أن تستخدم للتمييز بين الخيارين. بغض النظر عن الخيار الذي، char هو نوع منفصل عن اثنين آخرين وغير متوافق مع أي.

ووفقا لC برمجة كتاب اللغة عن طريق دينيس ريتشي الذي هو الكتاب القياسية بالأمر الواقع لANSI C، حرف عادي إما بالتوقيع أو غير موقعة على آلة تعتمد، ولكن طبع الحروف دائما إيجابيا.

وفقا لمعيار C وsignedness من شار عادي هو "تنفيذ محددة".

في المنفذين العام اختار أيهما أكثر كفاءة لتنفيذ على عمارتها. على النظم إلى x86 وقعت عام شار. على أنظمة الذراع وغير الموقعة عليه عموما (أبل دائرة الرقابة الداخلية هو استثناء).

وفقا ل "C ++ لغة برمجة" حسب بيارن ستروستروب، char هو "تنفيذ محددة". ويمكن أن يكون signed char أو unsigned char اعتمادا على التنفيذ. يمكنك التحقق ما إذا كان وقع char أم لا باستخدام std::numeric_limits<char>::is_signed.

والآن، كنا نعرف الأوراق القياسية التي تصل إلى التنفيذ.

ولكن كيف للتحقق من نوع غير signed أو unsigned، مثل char؟

وكتبت ماكرو للقيام بذلك:

و#define IS_UNSIGNED(t) ((t)~1 > 0)

وواختبار مع gcc، clang، وcl. لكنني لست متأكدا انها دائما آمنة لحالات أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top