هل توجد آلات، حيث المقي (Char)! = 1، أو على الأقل char_bit> 8؟

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

سؤال

هل توجد آلات (أو محامص)، حيث sizeof(char) != 1?

يفعل C99 قياسي يقول ان sizeof(char) عند تنفيذ الامتثال القياسي يجب أن يكون بالضبط 1؟ إذا فعل ذلك، من فضلك، أعطني رقم القسم واستبداله.

تحديث:إذا كان لدي جهاز (وحدة المعالجة المركزية)، والتي لا تستطيع معالجة البايتات (الحد الأدنى من القراءة هو 4 بايت، محاذاة)، ولكن 4-S فقط من البايتات (uint32_t), يمكن التحويل البرمجي لهذا الجهاز تحديد sizeof(char) إلى 4؟ sizeof(char) سيكون 1، ولكن شار سيكون 32 بت (CHAR_BIT وحدات الماكرو)

تحديث 2: لكن النتيجة sizeof ليست بايت! هو حجم شار. و char يمكن أن يكون 2 بايت، أو (قد يكون) 7 بت؟

تحديث 3:موافق. جميع الآلات sizeof(char) == 1. وبعد ولكن ما الأجهزة لديها CHAR_BIT > 8 ?

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

المحلول

انها دائما واحدة في C99، القسم 6.5.3.4:

عند تطبيقها على المعامل التي تحتوي على Char char أو char غير الموقعة أو char الموقعة أو (أو إصدار مؤهل منه) النتيجة هي 1.

تحرير: ليس جزءا من سؤالك، ولكن من أجل الفائدة من هاربيسون وستير، 3 إد. (قبل C99) ص. 148:

يتم أخذ وحدة التخزين لتكون كمية التخزين المحتلة بواسطة حرف واحد؛ حجم كائن من النوع char لذلك 1.

تحرير: في الإجابة على سؤالك المحدث، فإن السؤال التالي والإجابة من Harbison و Steele ذات الصلة (المرجع نفسه السابقين 4 من الفصل 6):

هل من المسموح به أن يكون لديك تطبيق ج في أي نوع char يمكن أن تمثل القيم التي تتراوح بين -2،147،483،648 من خلال 2،147،483،647 إذا كان الأمر كذلك، ماذا سيكون sizeof(char)تحت هذا التنفيذ؟ ماذا سيكون أصغر وأكبر نطاقات من النوع int?

الإجابة (المرجع نفسه، ص 382):

يسمح (إذا كان مهذرا) لتنفيذ استخدام 32 بت لتمثيل النوع char. وبعد بغض النظر عن التنفيذ، وقيمة sizeof(char)

في حين أن هذا لا يتناول الحال على وجه التحديد مكان، قل بايتز 8 بت و char هي 4 من هذه البايتات (مستحيلة فعلا مع تعريف C99، انظر أدناه)، حقيقة ذلك sizeof(char) = 1 دائما واضح من معيار C99 وهاربيسون وصالون.

تحرير: في الواقع (هذا استجابة لسؤال المحدثين الخاص بك)، بقدر ما يتعلق الأمر C99 sizeof(char) هو في بايت، من القسم 6.5.3.4 مرة أخرى:

يعطي مشغل Sizeof الحجم (بايتس) لعامله

جنبا إلى جنب مع الاقتباس أعلاه، بايت من 8 بت و char كما 4 من تلك البايتات مستحيلة: بالنسبة ل C99 بايت هو نفسه char.

في الإجابة على ذكرك إمكانية 7 بت char: هذا غير ممكن في C99. وفقا للقسم 5.2.4.2.1 من المعيار الحد الأدنى هو 8:

يجب أن تكون قيمهم المعرفة بالتنفيذ متساوين أو أكبر التركيز الخاص بي] في حجم تلك المبينة، مع نفس الإشارة.

- عدد البتات لأصغر كائن ليس حقل بعض الشيء (بايت)

 **CHAR_BIT 8**

- الحد الأدنى للقيمة لكائن من نوع سحر الموقع

**SCHAR_MIN -127//−(27−1)** 

- أقصى قيمة لكائن من النوع الشامل الموقع

**SCHAR_MAX +127//27−1** 

- القيمة القصوى للكائن من نوع char غير موقعة

**UCHAR_MAX 255//28−1** 

- الحد الأدنى القيمة لكائن من نوع Char

**CHAR_MIN**    see below 

- أقصى قيمة لكائن من النوع Char

**CHAR_MAX**    see below

[...]

إذا تم التعامل مع قيمة كائن من النوع Char كعادا صحيحا موقعة عند استخدامها في تعبير، تكون قيمة Char_min هي نفسها مثل Schar_min وقيمة Char_Max هي نفسها مثل Schar_Max. خلاف ذلك، يجب أن تكون قيمة char_min 0 وتكون قيمة char_max هي نفسها مثل uchar_max. يجب أن تساوي القيمة UCHAR_MAX 2 ^ ^ char_bit - 1.

نصائح أخرى

لا توجد آلات حيث sizeof(char) هو 4. دائما 1 بايت. قد يحتوي البايت على 32 بت، ولكن بقدر ما يتعلق الأمر بمبرمج C، إنه بايت واحد. لمزيد من التفاصيل، أنا في الواقع سوف أشير لك في الأسئلة الشائعة C ++ 26.6. وبعد هذا الارتباط يغطيها بشكل جيد للغاية وأنا معظومة إلى حد ما c ++ حصلت على كل هذه القواعد من C. يمكنك أيضا أن ننظر في comp.lang.c الأسئلة الشائعة 8.10. لشخصيات أكبر من 8 بت.

UPD2: ولكن النتيجة sizeof ليست بايت! هو حجم شار. و char يمكن أن يكون 2 بايت، أو (قد يكون) 7 بت؟

نعم، إنه بايتس. دعني اقولها مرة اخرى. sizeof(char) هو 1 البايت وفقا للمترجم C. ما يسميه الناس Colloquially بايت (8 بت) ليس بالضرورة هو نفسه ما يسميه مترجم C بايت. يختلف عدد البتات في بايت C اعتمادا على بنية الجهاز الخاصة بك. كما أنه مضمون ليكون 8 على الأقل.

PDP-10. و PDP-11 كان.

تحديث: لا يوجد مثل التحويل البرمجيات C99 ل PDP-10.

بعض طرازات الأجهزة التناظرية 32 بت SARC DSP لها Char_bit = 32، و Texas Instruments DSP من TMS32F28XX لديها Char_bit = 16، يقال ذلك.

تحديث: هناك GCC 3.2 ل PDP-10 مع char_bit = 9 (الشيك تشمل / حدود. في هذا الأرشيف).

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