// ==========================================================================
// $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 <iostream>
#include <bitset>

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<int>(ucVal) << " decimal." << endl;
  cout << "Converted to signed "; 
  cout << static_cast<int>(static_cast<char>(ucVal)) << " decimal and "; 
  cout << std::bitset<8*sizeof(ucVal)>(static_cast<char>(ucVal)) << endl; 
  cout << "==================================" << endl;

  cout << std::bitset<8*sizeof(cVal)>(cVal) << " corresponding to ";
  cout << static_cast<int>(cVal) << " decimal." << endl;
  cout << "Converted to unsigned "; 
  cout << static_cast<int>(static_cast<unsigned char>(cVal)) << " decimal and "; 
  cout << std::bitset<8*sizeof(cVal)>(static_cast<unsigned char>(cVal)) << endl; 
  cout << "==================================" << endl;

  // Example all is good
  cout << "Unsigned calculation: " << endl;
  unsigned char uRes = static_cast<unsigned char>(cVal) / ucVal;
  cout << std::bitset<8*sizeof(uRes)>(uRes) << " corresponding to ";
  cout << static_cast<int>(uRes) << " decimal." << endl;
  cout << "==================================" << endl;
  cout << "Signed calculation: " << endl;
  char sRes = cVal / static_cast<char>(ucVal);
  cout << std::bitset<8*sizeof(sRes)>(sRes) << " corresponding to ";
  cout << static_cast<int>(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<int>(cVal / ucVal) << " decimal." << endl;
  cout << "==================================" << endl;
 
  // Be aware!
  if ( cVal < ucVal ) {
    cout << static_cast<int>(cVal) << " is smaller than " 
	 << static_cast<int>(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;
}
