لماذا تستخدم تدفقات C++ char بدلاً من char غير الموقعة؟

StackOverflow https://stackoverflow.com/questions/277655

سؤال

لقد تساءلت دائمًا لماذا قامت مكتبة C++ Standard بإنشاء مثيل لتدفق basic_[io] وجميع متغيراته باستخدام char اكتب بدلاً من unsigned char يكتب. char يعني (اعتمادًا على ما إذا كان تم توقيعه أم لا) أنه يمكن أن يكون لديك تجاوز وتجاوز لعمليات مثل get()، مما سيؤدي إلى قيمة محددة من قبل التنفيذ للمتغيرات المعنية.مثال آخر هو عندما تريد إخراج بايت، غير منسق، إلى ostream باستخدامه put وظيفة.

أيه أفكار؟


ملحوظة:ما زلت غير مقتنع حقًا.لذا، إذا كنت تعرف الإجابة النهائية، فلا يزال بإمكانك نشرها بالفعل.

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

المحلول

وربما لقد أساء فهم السؤال، ولكن التحول من الحرف غير الموقعة على شار ليس غير محدد، هو تنفيذ التي تعتمد على (4،7-3 في C ++ القياسية).

ونوع من حرف 1 بايت في C ++ هو "شار"، وليس "الحرف غير الموقعة". وهذا يعطي تطبيقات أكثر قليلا حرية أن تفعل أفضل شيء في النظام الأساسي (على سبيل المثال، هيئة المعايير قد يعتقد ان هناك وحدات المعالجة المركزية حيث وقعت الحساب بايت أسرع من الحساب البايت غير الموقعة، على الرغم من أن هذا هو تكهنات من جانبي). أيضا من أجل التوافق مع C. ونتيجة لإزالة هذا النوع من عدم اليقين الوجودي من C ++ هو C #؛ -)

وبالنظر إلى أن "شار" نوع موجود، وأعتقد أنه من المنطقي للتيارات المعتادة لاستخدامه حتى لو لم يتم تعريف signedness لها. لذلك ربما يتم الرد على سؤالك من قبل الجواب، "لماذا لم C ++ فقط تحديد شار إلى أن تكون غير موقعة؟"

نصائح أخرى

لقد فهمت الأمر دائمًا بهذه الطريقة:الغرض من iostream الطبقة هي قراءة و/أو كتابة مجموعة من الأحرف، والتي، إذا فكرت في الأمر، هي كيانات مجردة يتم تمثيلها فقط بواسطة الكمبيوتر باستخدام ترميز الأحرف.يبذل معيار C++ جهدًا كبيرًا لتجنب تثبيت ترميز الأحرف، حيث يقول فقط "الكائنات المُعلنة كأحرف (char) يجب أن يكون كبيرًا بما يكفي لتخزين أي عضو في مجموعة الأحرف الأساسية للتطبيق،" لأنه لا يحتاج إلى فرض "مجموعة الأحرف الأساسية للتنفيذ" لتحديد لغة C++؛يمكن للمعيار ترك قرار أيّ يتم استخدام ترميز الأحرف في التنفيذ (المترجم مع تطبيق STL)، ولاحظ ذلك فقط char تمثل الكائنات أحرفًا مفردة في بعض الترميز.

يمكن لكاتب التنفيذ اختيار ترميز ثماني بتات واحد مثل ايزو-8859-1 أو حتى ترميز مزدوج الثماني مثل يو سي إس-2.لا يهم.طالما أ char الكائن "كبير بما يكفي لتخزين أي عضو في مجموعة الأحرف الأساسية للتطبيق" (لاحظ أن هذا يمنع صراحةً ترميزات متغيرة الطول)، فقد يختار التنفيذ أيضًا ترميزًا يمثل اللغة اللاتينية الأساسية بطريقة غير متوافقة مع أي ترميز شائع!

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

هنالك أربعة أنواع الأعداد الصحيحة الموقعة:"الحرف المُوقع"، و"short int"، و"int"، و"long int".

و unsigned char موجود في عائلة الأنواع الصحيحة غير الموقعة:

لكل نوع من أنواع الأعداد الصحيحة الموقعة، يوجد ما يقابلها (ولكنها مختلفة) نوع عدد صحيح غير موقعة:"حرف غير موقع" و"عدد صحيح قصير غير موقع" و"عدد صحيح غير موقع" و"عدد صحيح طويل غير موقع"...

التشابه الوحيد بين char, signed char, ، و unsigned char الأنواع هي أن "[هم] يشغلون نفس مقدار التخزين ولديهم نفس متطلبات المحاذاة".وهكذا يمكنك reinterpret_cast من char * ل unsigned char * لتحديد القيمة الرقمية للحرف في مجموعة أحرف التنفيذ.

للإجابة على سؤالك، سبب استخدام STL char كنوع افتراضي، يرجع ذلك إلى أن التدفقات القياسية مخصصة لقراءة و/أو كتابة تدفقات من الأحرف، ممثلة بـ char كائنات وليس أعداد صحيحة (signed char و unsigned char).استخدام char مقابل القيمة الرقمية هي وسيلة لفصل المخاوف.

وحرف هو حرف، الحرف غير الموقعة للبايت الخام من البيانات، وقعت حرف ل، وأيضا، وقعت البيانات.

والمعيار لا تحديد ما إذا وقع أو سوف تستخدم الحرف غير الموقعة لتنفيذ شار - هو مترجم محددة. وهي تحدد فقط أن "شار" سيكون "كافيا" لعقد الأحرف على النظام لكم - وكانت الطريقة الشخصيات في تلك الأيام، والتي هي، لا UNICODE

وعن طريق "شار" للأحرف هي الطريقة القياسية للذهاب. باستخدام الحرف غير الموقعة هو الإختراق، على الرغم من أنه سوف تطابق تنفيذ مجمع للحرف على معظم المنصات.

هذا تعليق يفسر ذلك بشكل جيد. أن أقتبس:

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

وشار وقعت والحرف غير الموقعة والحسابية، وأنواع لا يتجزأ تماما مثل int و صحيح غير الموقعة. من ناحية أخرى، فإن المقصود شار صراحة ليكون "I / O" النوع الذي يمثل بعض مبهمة، الوحدة الأساسية الخاصة بالنظام من البيانات على النظام الأساسي الخاص بك. وأود أن استخدامها في هذه الروح.

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