इस कोड ऐसा नहीं करता है, जो उसे करना चाहिए था:क्यों std: :(i) ओस्ट्रीम उपचार एक पाठ के रूप में हस्ताक्षरित/हस्ताक्षरित चार और एक पूर्णांक नहीं है?
#include <iostream>
#include <cstdint>
int main()
{
uint8_t small_integer;
std::cin >> small_integer;
std::cout << small_integer;
}
वजह साफ है: uint8_t
unsigned char
के लिए एक typedef है और धाराएं इस प्रकार एक पाठ के रूप में इलाज:
विजुअल C++ 2015 कार्यान्वयन
template<class _Traits> inline
basic_istream<char, _Traits>& operator>>(
basic_istream<char, _Traits>& _Istr, unsigned char& _Ch)
{ // extract an unsigned char
return (_Istr >> (char&)_Ch);
}
और operator <<
के लिए char
पर कास्ट के साथ एक समान कोड।
मेरे सवालों का:
- इस व्यवहार (स्ट्रीमिंग ऑपरेटरों इलाज पर हस्ताक्षर किए चरित्र प्रकार और कोई पूर्णांक नहीं के रूप में/अहस्ताक्षरित चार) मानक के लिए आवश्यक है? यदि यह है तो:
- ऐसे counterintuitive semantics के पीछे तर्क क्या है?
- क्या इसे दोष माना जाना चाहिए, क्या इस अर्थशास्त्र को बदलने के प्रस्ताव थे?
मैं शायद एक छोटे से स्पष्टीकरण कारण है कि मैं यह counterintuitive पर विचार जोड़ना चाहिए। हालांकि टाइप नाम में शब्द चार है, signed
या unsigned
भाग विशेष पूर्णांक अर्थपूर्ण निर्दिष्ट करता है और उन प्रकारों को आम तौर पर बाइट आकार वाले पूर्णांक के रूप में उपयोग किया जाता है। यहां तक कि मानक int8_t
/uint8_t
उनके माध्यम से परिभाषित करता है।
युपीडी: सवाल unsigned char
और signed char
के लिए स्ट्रीमिंग ऑपरेटर भार के के व्यवहार के बारे में है।
यह कष्टप्रद है। मैंने अपना खुद का to_string फ़ंक्शन का उपयोग किया है जो एक चरित्र के रूप में char का इलाज करते समय (u) int8_t पूर्णांक के रूप में व्यवहार करता है। मैंने uint8_t, int8_t, और char के लिए अलग-अलग विशेषज्ञताओं को जोड़ा क्योंकि मुझे लगता है कि यह उन तीनों के लिए बिल्कुल मान्य है जो तीन अलग-अलग प्रकार नहीं हैं। – Matt
आपके प्रश्न का उत्तर नहीं है, लेकिन ['std :: byte'] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0257r0.pdf) का प्रस्ताव दिया गया है इस समस्या को दूर करो। – Praetorian
@ प्रेटोरियन, जबकि यह वास्तव में एक दिलचस्प प्रस्ताव है, यह एक बिल्कुल अलग मुद्दे को संबोधित करता है। –