2016-08-25 8 views
9
#include <stdio.h> 
#include <iostream> 

int main() 
{ 
    using namespace std; 
    uint64_t a = 3; 
    if (uint64_t(~a) == (~a)) 
     cout << "right" << endl;//right 
    else 
     cout << "wrong" << endl; 
    cout << sizeof(~a) << endl;//8 

    uint8_t b = 3; 
    if (uint8_t(~b) == (~b)) 
     cout << "right" << endl; 
    else 
     cout << "wrong" << endl;//wrong 
    cout << sizeof(~b) << endl;//4 
    getchar(); 
    return 0; 
} 

~ uint8_t int मान देता है, लेकिन ~ uint64_t uint64_t देता है।सी ++ uint64_t पर bitwise ऑपरेटर ~ और uint8_t विभिन्न प्रकारों को वापस क्यों करें?

क्या यह अपरिभाषित व्यवहार है?

+4

आपको पूर्णांक पदोन्नति नियमों को देखने की आवश्यकता है। – NathanOliver

+3

यह परिभाषित व्यवहार है, सभी अंकगणितीय ऑपरेटरों ('~' सहित) ऑपरेटरों को 'int' को बढ़ावा देते हैं यदि वे' int' से संक्षिप्त प्रकार हैं। यह सी के शुरुआती दिनों से आता है जब गणित में अंकगणित किया गया था और वे रजिस्टर की तुलना में छोटी इकाइयों पर अंकगणित अनुकरण करके इसे अधिक जटिल बनाना नहीं चाहते थे। –

उत्तर

6

से en.cppreference

operator~ का परिणाम पोस्ट करना बिटवाइज़ नहीं (एक पूरक) तर्क का मूल्य है (पदोन्नति के बाद)।

Integral promotionchar, short int आदि (int से संकरा प्रकार) के लिए लागू किया जाता है और परिणाम गंतव्य प्रकार के लिए casted जा करने के लिए करता है, तो गंतव्य int नहीं है की जरूरत है।

यह आपके मामले में sizeof(~b) == sizeof(int) का कारण है।

संबंधित मुद्दे