كيفية إخراج أنواع char غير موقعة/الموقعة أو كمناسبات أعداد صحيحة مع << في C ++

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

سؤال

خلفية:

لدي عوامل دفق القالب (على سبيل المثال operator << (ostream &, std::vector <T>)) (عناصر حاوية الإخراج التي قد تكون من نوع عدد صحيح 8 بت ، (على سبيل المثال unsigned char, int_least8_t, ، إلى آخره).

مشكلة:

الافتراضي هو أن هذه الأنواع هي الإخراج كـ char (ASCII). أنا فقط استخدمت char (أو wchar_t أو أيا كان) لمتغيرات ASCII ، لا تُوقف/الموقّع أبدًا. كيف أحصل على هذه الأنواع الثمانية الأخرى لتكون دائمًا الإخراج كـ signed int / unsigned int (أرقام) بدلاً من ذلك ، حتى عندما لا يعرف المتصل النوع؟

المحاولات الأولى:

لقد حاولت (مع GCC) على سبيل المثال تحديد operator << (ostream &, unsigned char) مع ممثلين فيه (أي stream << static_cast <int> (value). هذا يعمل ل unsigned char القيم ، ولكن بعد ذلك uint8_t لا يزال يحصل على الإخراج ك char.

نفس النوع الأساسي (أي unsigned/signed char لا يمكن استخدام operator << (ostream &, int_fast8_t).

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

المحلول

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

template< T >
struct output_trait {
    typedef const T & output_type;
}

في مشغلك تكتب:

std::cout << static_cast< output_trait< T >::output_type >( variable ) << std::endl;

لن يقوم هذا بإلغاء افتراضيًا ، ولكن لأنواعها output_trait متخصص أنه سيقوم بعمل طاقم:

template<>
struct output_trait< unsigned char > {
    typedef unsigned int output_type;
}

نصائح أخرى

أنت تخلط بين البيانات الفعلية المحتفظ بها في متغير ، مع أي تمثيل تختاره لطباعته.

أعتقد أنه من هذا الطريق: chars, ints, doubles, longs, ، ما إذا كانت جميعها فقط قطعًا من الذاكرة لتخزين الأرقام. عدد ، أو كنجوم في السماء بمساعدة OpenGL.

إذا كنت ترغب في رؤية الرقم وراء الحرف "A" ، فما عليك سوى إرشاد برنامجك إلى معالجة جزء كبير من الذاكرة (هذا بالنسبة لك يحتوي على رقم "A") كرقم. استخدام يلقي. هنا:

http://www.cplusplus.com/doc/tutorial/typecasting/

معرفة ما إذا كان هذا يساعد!

يمكنك ببساطة إلقاءها:

#include<iostream>

int main()
{
 uint8_t blah = 65;
 std::cout << static_cast<int>(blah) << "\n";
 return 0;
}

65

إذا فهمت لك الصواب .. إخراجها مثل هذا:

std::cout << ( unsigned int )char << '\n';

أو المزيد من نمط C ++ - استخدم static_cast ، على سبيل المثال:

int main()
{
    char a = 'a';
    char b = 97;
    std::cout << static_cast< unsigned int >( a ) << '\n';
    std::cout << static_cast< unsigned int >( b ) << '\n';
    return 0;
}

على حد سواء std::cout سوف يطبع نفسه: الأول - رمز ASCII من 'a': 97, والثاني - فقط القيمة 97, ، مخزنة في ب. كلاهما، a و b, ، هي نفسها تماما.

يمكنك إلقاؤها قبل إخراجها:

std::cout << (unsigned int) container[index];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top