سؤال
في 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 ؟
- كل بت المشاركة في تحديد القيمة التي لا الحشو بت تحدث في الكائن.
- مضيفا مرة واحدة فقط
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