وشار وقعت أو غير الموقعة بشكل افتراضي؟
سؤال
في كتاب "المرجع الكامل لل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
. لكنني لست متأكدا انها دائما آمنة لحالات أخرى.