// ========================================================================== // $Id: implicit.cpp,v 1.1 2015/09/15 01:56:57 jlang Exp $ // CSI2372 example Code for lecture 2 // ========================================================================== // (C)opyright: // // Jochen Lang // EECS, University of Ottawa // 800 King Edward Ave. // Ottawa, On., K1N 6N5 // Canada. // http://www.eecs.uottawa.ca // // Creator: jlang (Jochen Lang) // Email: jlang@eecs.uottawa.ca // ========================================================================== // $Log: implicit.cpp,v $ // Revision 1.1 2015/09/15 01:56:57 jlang // Added example for implicit conversions with signed/unsigned types // // // ========================================================================== #include #include using std::cout; using std::endl; int main() { // Mixing signed and unsigned types is to be avoided unsigned char ucVal = 0x0F; char cVal = 0x8F; cout << "==================================" << endl; cout << std::bitset<8*sizeof(ucVal)>(ucVal) << " corresponding to "; cout << static_cast(ucVal) << " decimal." << endl; cout << "Converted to signed "; cout << static_cast(static_cast(ucVal)) << " decimal and "; cout << std::bitset<8*sizeof(ucVal)>(static_cast(ucVal)) << endl; cout << "==================================" << endl; cout << std::bitset<8*sizeof(cVal)>(cVal) << " corresponding to "; cout << static_cast(cVal) << " decimal." << endl; cout << "Converted to unsigned "; cout << static_cast(static_cast(cVal)) << " decimal and "; cout << std::bitset<8*sizeof(cVal)>(static_cast(cVal)) << endl; cout << "==================================" << endl; // Example all is good cout << "Unsigned calculation: " << endl; unsigned char uRes = static_cast(cVal) / ucVal; cout << std::bitset<8*sizeof(uRes)>(uRes) << " corresponding to "; cout << static_cast(uRes) << " decimal." << endl; cout << "==================================" << endl; cout << "Signed calculation: " << endl; char sRes = cVal / static_cast(ucVal); cout << std::bitset<8*sizeof(sRes)>(sRes) << " corresponding to "; cout << static_cast(sRes) << " decimal." << endl; cout << "==================================" << endl; cout << "Implicit integral promotion and conversion: " << endl; cout << std::bitset<8*sizeof(cVal / ucVal)>(cVal / ucVal) << " corresponding to "; cout << static_cast(cVal / ucVal) << " decimal." << endl; cout << "==================================" << endl; // Be aware! if ( cVal < ucVal ) { cout << static_cast(cVal) << " is smaller than " << static_cast(ucVal) << " as signed/unsigned character." << endl; } int iVal = cVal; unsigned int uiVal = ucVal; if ( iVal < uiVal ) cout << iVal << " is smaller than " << uiVal << " as int." << endl; else cout << iVal << " is NOT smaller than " << uiVal << " as signed/unsigned int." << endl; return 0; }