هل توجد آلات، حيث المقي (Char)! = 1، أو على الأقل char_bit> 8؟
سؤال
هل توجد آلات (أو محامص)، حيث 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 (الشيك تشمل / حدود. في هذا الأرشيف).