मैं कोड का निम्न भाग है:घटाव पर हस्ताक्षर किए देता
#include <cstdint>
template <typename T>
T test(T a, T b)
{
float aabb = reinterpret_cast<float>(a - b);
}
int main(int argc, const char *argv[])
{
std::uint8_t a8, b8;
test(a8, b8);
return 0;
}
मुझे पता है कि reinterpret_cast<float>
काम नहीं कर सकता और यह संकलन समय पर त्रुटि देता है। मैं उस त्रुटि का उपयोग कर रहा हूं ताकि संकलक मुझे a - b
का प्रकार बताए।
समस्या यह है कि इस मामले में, यह कहता है कि a - b
का प्रकार int
है जब दोनों uint8_t (unsigned char)
हैं। uint16_t
के साथ ऐसा ही होता है। लेकिन uint32_t
के साथ नहीं जो यह कहता है कि a - b
unsigned int
है।
तो, मेरा सवाल यह है: क्या यह इरादा व्यवहार है (जो हस्ताक्षरित चार - हस्ताक्षरित चार एक int देता है), या यह किसी प्रकार का अजीब कंपाइलर बग है (जीसीसी और क्लैंग दोनों के साथ परीक्षण किया गया है)?
यह लगता है [प्रासंगिक] (http://stackoverflow.com/questions/29817927/why-are-integer-types-promoted-during-addition-in-c?rq=1) (पदोन्नति सी और सी ++ में कम से कम समान है, अगर ऐसा नहीं है)। – chris
हाँ, 'int' से छोटा कोई भी प्रकार अंकगणित के लिए 'int' को बढ़ावा देता है। – ShadowRanger
'reinterpret_cast' से बचें, यह कार्यान्वयन-परिभाषित है। – vsoftco