سؤال

في C/C++, ما unsigned char يستخدم ؟ كيف هي مختلفة عن العادية char?

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

المحلول

في C++, هناك ثلاثة متميزة أنواع الحرف:

  • char
  • signed char
  • unsigned char

إذا كنت تستخدم أنواع الحرف ل النص, استخدام غير مؤهلين char:

  • هو نوع من الطابع حرفية مثل 'a' أو '0'.
  • هذا هو النوع الذي يجعل C سلاسل مثل "abcde"

كما يعمل عدد قيمة ، ولكنها غير محدد سواء كان ذلك قيمة تعامل على أنها موقعة أو غير موقعة.حذار حرف مقارنات من خلال عدم المساواة - على الرغم من أن إذا كنت تحد نفسك ASCII (0-127) كنت على وشك آمنة.

إذا كنت تستخدم أنواع الحرف كما أرقام, استخدام:

  • signed char, الذي يمنحك على الأقل على -127 إلى 127 النطاق.(-128 إلى 127 هو شائع)
  • unsigned char, الذي يمنحك على الأقل 0 إلى 255 مجموعة.

"على الأقل" ، لأن C++ القياسية فقط يعطي الحد الأدنى من مجموعة من القيم التي من كل نوع عددي لتغطية. sizeof (char) مطلوب 1 (أيبايت واحد), ولكن بايت ويمكن نظريا على سبيل المثال 32 بت. sizeof لا يزال التقرير حجمه ، 1 - معنى هذا أنك يمكن أن لديك sizeof (char) == sizeof (long) == 1.

نصائح أخرى

هذا هو التنفيذ تعتمد ، ج القياسية لا يعرف وقعت-نيس char.اعتمادا على منصة شار قد يكون signed أو unsigned, لذا عليك أن تسأل صراحة signed char أو unsigned char إذا كان التطبيق الخاص بك يعتمد على ذلك.مجرد استخدام char إذا كنت تنوي تمثل شخصيات من السلاسل ، وهذا يطابق ما منصة يضع في السلسلة.

الفرق بين signed char و unsigned char كما كنت تتوقع.على معظم المنصات ، signed char سوف تكون 8 بت المتمم عدد تتراوح بين -128 إلى 127, ، unsigned char سوف تكون 8 بت غير صحيح (0 إلى 255).ملاحظة المعيار لا يتطلب ذلك char أنواع 8 بت فقط sizeof(char) عودة 1.يمكنك الحصول على عدد البتات في شار مع CHAR_BIT في limits.h.يوجد عدد قليل من منصات اليوم حيث سوف يكون هذا شيء آخر غير 8, ، على الرغم من.

وهناك لطيفة ملخص هذه المسألة هنا.

كما ذكر آخرون منذ أن نشر هذا, كنت أفضل حالا باستخدام int8_t و uint8_t إذا كنت تريد حقا أن تمثل صغيرة الاعداد الصحيحه.

لأني أشعر حقا ، أنا فقط أريد أن الدولة بعض قواعد C و C++ (هم نفس في هذا الصدد).أولا ، كل بت من unsigned char المشاركة في تحديد قيمة إذا كان أي char غير الموقعة الكائن.ثانيا ، unsigned char هو صراحة غير موقعة.

الآن كان لي نقاش مع أحدهم حول ما يحدث عند تحويل قيمة -1 من نوع int إلى unsigned char.ورفض فكرة أن الناتج unsigned char كل بت تعيين إلى 1 ، لأنه كان قلقا بشأن التوقيع على التمثيل.لكنه لم يكن لديك إلى.إنه فور الخروج من هذه القاعدة أن التحويل لا ما هو المقصود:

إذا كان نوع جديد غير موقع ، القيمة التي يتم تحويلها من قبل مرارا وتكرارا إضافة أو طرح أكثر من القيمة القصوى التي يمكن أن تكون ممثلة في نوع جديد حتى قيمة في نطاق من نوع جديد.(6.3.1.3p2 في C99 مشروع)

هذا هو الوصف الرياضي.C++ توضح ذلك حيث مودولو حساب التفاضل والتكامل ، والتي ينتج نفس القاعدة.على أي حال, ما هو لا ضمان أن كل بت في عدد صحيح -1 هي واحدة قبل التحويل.ماذا لدينا حتى نتمكن من المطالبة الناتجة عن ذلك unsigned char لديه كل CHAR_BIT بت تحولت إلى 1 ؟

  1. كل بت المشاركة في تحديد القيمة التي لا الحشو بت تحدث في الكائن.
  2. مضيفا مرة واحدة فقط UCHAR_MAX+1 إلى -1 سوف تسفر عن قيمة في مجموعة ، وهي UCHAR_MAX

هذا يكفي, في الواقع!لذلك كلما كنت تريد أن يكون لها unsigned char بعد كل بت واحد ، يمكنك القيام

unsigned char c = (unsigned char)-1;

ويترتب على ذلك أيضا أن يتم التحويل لا فقط اقتطاع أعلى ترتيب البتات.حظا الحدث المتمم هو مجرد اقتطاع هناك, ولكن نفس هذا ليس صحيحا بالضرورة الأخرى التوقيع على تعهدات.

كما على سبيل المثال الأعراف من char غير الموقعة:

char غير الموقعة وغالبا ما تستخدم في رسومات الحاسوب, والتي في كثير من الأحيان (ولكن ليس دائما) يعين بايت واحد لكل لون العنصر.ومن الشائع أن نرى RGB (أو رغبا) اللون ممثلة 24 (32) بت كل char غير الموقعة.منذ char غير الموقعة قيم تقع في نطاق [0,255] ، القيم عادة ما تفسر على أنها:

  • 0 معنى انعدام معين لون العنصر.
  • 255 يعني 100% معين لون الصباغ.

إذا كنت في نهاية المطاف مع RGB الأحمر (255,0,0) -> (100% الأحمر ، 0% الأخضر ، 0% الأزرق).

لماذا لا تستخدم وقعت شار?الحساب بت التحول يصبح مشكلة.كما أوضح بالفعل ، وقعت شار'ق مجموعة أساسا تحول من -128.بسيط جدا وساذج (في الغالب غير المستخدمة) طريقة لتحويل RGB إلى الرمادي هو المتوسط كل ثلاثة لون المكونات ، ولكن هذا يعمل في مشاكل عند قيم اللون مكونات سلبية.الأحمر (255, 0, 0) في المتوسط إلى (85, 85, 85) عند استخدام char غير الموقعة الحسابية.ومع ذلك ، إذا كانت القيم وقعت شارs (127,-128,-128), نحن في نهاية المطاف مع (-99, -99, -99) ، التي من شأنها أن تكون (29, 29, 29) في char غير الموقعة الفضاء, وهو غير صحيح.

إذا كنت ترغب في استخدام حرف صغير صحيح ، وأسلم طريقة للقيام بذلك هي مع int8_tو uint8_t أنواع.

signed char لديها مجموعة -128 إلى 127; unsigned char وقد النطاق من 0 إلى 255.

char سوف تكون أي ما يعادل إما توقيع الحرف أو غير موقعة تشار ، اعتمادا على مترجم, ولكن هو نوع متميز.

إذا كنت تستخدم ج-أسلوب السلاسل, مجرد استخدام char.إذا كنت بحاجة إلى استخدام حرف على الحساب (نادرة جدا) ، تحديد موقعة أو غير موقعة صراحة لقابلية.

char و unsigned char لا يضمن أن تكون 8 بت أنواع على جميع المنصات—يتم ضمان أن تكون 8 بت أو أكبر.بعض المنابر 9-بت و 32-بت أو 64-بت بايت.ومع ذلك ، فإن معظم المنصات المشتركة اليوم (ويندوز, ماك, لينكس x86, الخ.) 8-بت بايت.

حيث مباشر القيم العادية شار يستخدم عندما تكون القيم هي معروفة لتكون بين CHAR_MIN و CHAR_MAX بينما غير موقعة تشار يوفر مزدوج النطاق على نهاية إيجابية.على سبيل المثال ، إذا CHAR_BIT 8, مجموعة من العادية char هو فقط ضمان أن تكون [0, 127] (لأنها يمكن أن تكون موقعة أو غير موقعة) في حين unsigned char سوف يكون [0, 255] ، signed char سوف يكون [-127, 127].

حيث إنها تستخدم معايير تسمح الكائنات من جراب (القديم عادي البيانات) ليتم تحويلها مباشرة إلى مجموعة من char غير الموقعة.هذا يسمح لك لدراسة التمثيل و بت أنماط الكائن.نفس ضمان آمنة نوع المجانسه لا وجود لها على شار أو توقيع الحرف.

unsigned char يأخذ القيم الايجابية....مثل 0 إلى 255

حيث

signed char يأخذ كل القيم الإيجابية والسلبية....مثل -128 إلى +127

غير موقعة تشار هو (غير موقعة) قيمة البايت (من 0 إلى 255).كنت قد يكون التفكير في "شار" من حيث كونه "شخصية" ولكن هو حقا قيمة عددية.العادية "شار" توقيع ، بحيث يكون لديك 128 قيم هذه القيم خريطة الأحرف باستخدام الترميز ASCII.ولكن في كلتا الحالتين, ما كنت تخزين في الذاكرة هو قيمة بايت.

إذا كنت ترغب في استخدام مختلف أنواع محددة من طول signedness, ربما كنت أفضل حالا مع uint8_t, int8_t, uint16_t ، وما إلى ذلك ببساطة لأنها لا تفعل بالضبط ما يقولون.

غير موقعة تشار يستخدم بت المحجوزة علامة العادية شار كما عدد آخر.هذه التغييرات النطاق إلى [0 - 255] بدلا من [-128 - 127].

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

char غير الموقعة هو قلب كل بت الخداع.تقريبا في جميع مترجم لجميع منصة غير موقعة تشار هو ببساطة بايت.صحيح غير الموقعة من (عادة) 8 بت.التي يمكن أن يعامل على أنه صغير صحيح أو مجموعة من البتات.

في الإدمان ، وكما قال شخص آخر ، معيار لا تحدد علامة شار.بحيث يكون لديك 3 متميزة "شار" أنواع:شار وقعت شار char غير الموقعة.

بعض غوغلينغ وجدت هذا, حيث كان الناس نقاش حول هذا.

غير موقعة تشار هو في الأساس بايت واحد.لذلك يمكنك استخدام هذا إذا كنت بحاجة إلى بايت واحد من البيانات (على سبيل المثال ، ربما كنت ترغب في استخدامه لضبط الأعلام وإيقاف يجب تمريرها إلى الدالة, كما يحدث غالبا في Windows API).

ونقلت فروم "البرمجة c laugage" كتاب:

التصفيات signed أو unsigned يمكن تطبيقها على شار أو أي عدد صحيح.غير الأرقام دائما موجبة أو صفر ، الانصياع لقوانين الحساب مودولو 2^n, حيث n هو عدد البتات في النوع.لذا, فعلى سبيل المثال, إذا كان حرف 8 بت, char غير الموقعة المتغيرات القيم بين 0 و 255 ، في حين وقع حرف القيم بين -128 و 127 (في الصورة يكمل الجهاز.) سواء عادي حرف موقعة أو غير موقعة هو آلة تعتمد ، ولكن القابلة للطباعة هي دائما إيجابية.

char غير الموقعة يأخذ القيم الايجابية:0 إلى 255 وقعت شار يأخذ القيم الإيجابية والسلبية:-128 إلى +127

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