Why are char << and char >> intermediate results int
<p>cygwin gcc 4.5.3</p>

<p>I am trying to determine the intermediate results used in various computations in C++. For 'char' I get the follwoing results (x is a char):</p>

<pre><code>x op y is of type char if y is a char/unsigned char
x op y is of type y otherwise except if op is left/right shift
</code></pre>

<p>For left/right shifts, the intermediate result is of type 'int', which is contrary to all other computations. Is this the standard implementation?</p>

<p>Here is the code used (don't get too excited by it):</p>

<pre><code># include &lt;iostream&gt;
# include &lt;iomanip&gt;
# include &lt;typeinfo&gt;
# include "cstdio"
# include &lt;cstdlib&gt;

using namespace std;

typedef unsigned char  UCHAR;
typedef unsigned short USHORT;
typedef unsigned int   INT;
typedef unsigned long  ULONG;
string find(type_info* info) {
   struct type {
      type_info* typeInfo;
      string     name;
   };
   int i;
   static type types[] = { {const_cast&lt;type_info*&gt;(&amp;typeid(bool)),   " BOOL"  }
                         , {const_cast&lt;type_info*&gt;(&amp;typeid(char)),   " CHAR"  }
                         , {const_cast&lt;type_info*&gt;(&amp;typeid(UCHAR)),  " UCHAR" }
                         , {const_cast&lt;type_info*&gt;(&amp;typeid(short)),  " SHORT" }
                         , {const_cast&lt;type_info*&gt;(&amp;typeid(USHORT)), " USHORT"}
                         , {const_cast&lt;type_info*&gt;(&amp;typeid(int)),    " INT"   }
                         , {const_cast&lt;type_info*&gt;(&amp;typeid(uint)),   " UINT"  }
                         , {const_cast&lt;type_info*&gt;(&amp;typeid(long)),   " LONG"  }
                         , {const_cast&lt;type_info*&gt;(&amp;typeid(ULONG)),  " ULONG" }
                         };
   for(i = 0; i &lt; sizeof(types)/sizeof(types[0]); i++ )
      if (types[i].typeInfo == info) break;
   if (i &gt;= sizeof(types)/sizeof(types[0])) return " NOT FOUND";
   return types[i].name;
}
void func0(char x) {
   ios_base::fmtflags ioFlags = cout.flags();
   string info = find(const_cast&lt;type_info*&gt;(&amp;typeid(x)));
   char save = x;
   cout &lt;&lt; "func0(char " &lt;&lt; (long)x &lt;&lt; ')' &lt;&lt; endl;
   cout &lt;&lt; "!x  " &lt;&lt; setw(12) &lt;&lt; (!x)    &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (!x) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(!x))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "~x  " &lt;&lt; setw(12) &lt;&lt; (~x)    &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (~x) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(~x))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "+x  " &lt;&lt; setw(12) &lt;&lt; (+x)    &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (+x) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(+x))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "-x  " &lt;&lt; setw(12) &lt;&lt; (-x)    &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (-x) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(-x))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "++x " &lt;&lt; setw(12) &lt;&lt; (long)(++x)    &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (++x) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(++x))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' '); x = save;
   cout &lt;&lt; "--x " &lt;&lt; setw(12) &lt;&lt; (long)(--x)    &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (--x) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(--x))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' '); x = save;
   cout &lt;&lt; "x++ " &lt;&lt; setw(12) &lt;&lt; (long)(x++)    &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x++) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x++))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' '); x = save;
   cout &lt;&lt; "x-- " &lt;&lt; setw(12) &lt;&lt; (long)(x--)    &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x--) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x--))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; endl;

}
void func1(char x, char y) {
   ios_base::fmtflags ioFlags = cout.flags();
   cout &lt;&lt; "func1(char " &lt;&lt; (signed long)x &lt;&lt; ", char " &lt;&lt; (unsigned long)y &lt;&lt; ')' &lt;&lt; endl;
   cout &lt;&lt; "x  + y " &lt;&lt; setw(12) &lt;&lt; (x  + y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  + y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x + y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  - y " &lt;&lt; setw(12) &lt;&lt; (x  - y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  - y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x - y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  * y " &lt;&lt; setw(12) &lt;&lt; (x  * y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  * y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x * y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   if (y == 0) {
        cout &lt;&lt; "x  / y " &lt;&lt; x &lt;&lt; " / 0" &lt;&lt;  endl;
   } else {
        cout &lt;&lt; "x  / y " &lt;&lt; setw(12) &lt;&lt; (x  / y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x / y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x / y))) &lt;&lt; endl;
   }
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x %  y " &lt;&lt; setw(12) &lt;&lt; (x  &amp; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  &amp; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  &amp; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x &lt;&lt; y " &lt;&lt; setw(12) &lt;&lt; (x &lt;&lt; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x &lt;&lt; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x &lt;&lt; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x &gt;&gt; y " &lt;&lt; setw(12) &lt;&lt; (x &gt;&gt; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x &gt;&gt; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x &gt;&gt; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  &amp; y " &lt;&lt; setw(12) &lt;&lt; (x  &amp; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  &amp; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  &amp; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  | y " &lt;&lt; setw(12) &lt;&lt; (x  | y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  | y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  | y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  ^ x " &lt;&lt; setw(12) &lt;&lt; (x  ^ y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  ^ y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  ^ y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; endl;
}
void func1(char x, unsigned char y) {
   ios_base::fmtflags ioFlags = cout.flags();
   cout &lt;&lt; "func1(char " &lt;&lt; (signed long)x &lt;&lt; ", uchar " &lt;&lt; (unsigned long)y &lt;&lt; ')' &lt;&lt; endl;
   cout &lt;&lt; "x  + y " &lt;&lt; setw(12) &lt;&lt; (x  + y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  + y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x + y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  - y " &lt;&lt; setw(12) &lt;&lt; (x  - y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  - y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x - y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  * y " &lt;&lt; setw(12) &lt;&lt; (x  * y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  * y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x * y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   if (y == 0) {
        cout &lt;&lt; "x  / y " &lt;&lt; x &lt;&lt; " / 0" &lt;&lt;  endl;
   } else {
        cout &lt;&lt; "x  / y " &lt;&lt; setw(12) &lt;&lt; (x  / y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x / y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x / y))) &lt;&lt; endl;
   }
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x %  y " &lt;&lt; setw(12) &lt;&lt; (x  &amp; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  &amp; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  &amp; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x &lt;&lt; y " &lt;&lt; setw(12) &lt;&lt; (x &lt;&lt; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x &lt;&lt; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x &lt;&lt; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x &gt;&gt; y " &lt;&lt; setw(12) &lt;&lt; (x &gt;&gt; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x &gt;&gt; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x &gt;&gt; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  &amp; y " &lt;&lt; setw(12) &lt;&lt; (x  &amp; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  &amp; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  &amp; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  | y " &lt;&lt; setw(12) &lt;&lt; (x  | y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  | y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  | y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  ^ x " &lt;&lt; setw(12) &lt;&lt; (x  ^ y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  ^ y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  ^ y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; endl;
}
void func1(char x, unsigned long y) {
   ios_base::fmtflags ioFlags = cout.flags();
   cout &lt;&lt; "func1(char " &lt;&lt; (signed long)x &lt;&lt; ", ulong " &lt;&lt; y &lt;&lt; ')' &lt;&lt; endl;
   cout &lt;&lt; "x  + y " &lt;&lt; setw(12) &lt;&lt; (x  + y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  + y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x + y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  - y " &lt;&lt; setw(12) &lt;&lt; (x  - y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  - y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x - y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  * y " &lt;&lt; setw(12) &lt;&lt; (x  * y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  * y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x * y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   if (y == 0) {
        cout &lt;&lt; "x  / y " &lt;&lt; x &lt;&lt; " / 0" &lt;&lt;  endl;
   } else {
        cout &lt;&lt; "x  / y " &lt;&lt; setw(12) &lt;&lt; (x  / y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x / y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x / y))) &lt;&lt; endl;
   }
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x %  y " &lt;&lt; setw(12) &lt;&lt; (x  &amp; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  &amp; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  &amp; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x &lt;&lt; y " &lt;&lt; setw(12) &lt;&lt; (x &lt;&lt; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x &lt;&lt; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x &lt;&lt; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x &gt;&gt; y " &lt;&lt; setw(12) &lt;&lt; (x &gt;&gt; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x &gt;&gt; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x &gt;&gt; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  &amp; y " &lt;&lt; setw(12) &lt;&lt; (x  &amp; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  &amp; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  &amp; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  | y " &lt;&lt; setw(12) &lt;&lt; (x  | y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  | y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  | y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  ^ x " &lt;&lt; setw(12) &lt;&lt; (x  ^ y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  ^ y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  ^ y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; endl;
}
void func1(char x, long y) {
   ios_base::fmtflags ioFlags = cout.flags();
   cout &lt;&lt; "func1(char " &lt;&lt; (signed long)x &lt;&lt; ", long " &lt;&lt; y &lt;&lt; ')' &lt;&lt; endl;
   cout &lt;&lt; "x  + y " &lt;&lt; setw(12) &lt;&lt; (x  + y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  + y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x + y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  - y " &lt;&lt; setw(12) &lt;&lt; (x  - y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  - y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x - y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  * y " &lt;&lt; setw(12) &lt;&lt; (x  * y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  * y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x * y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   if (y == 0) {
        cout &lt;&lt; "x  / y " &lt;&lt; x &lt;&lt; " / 0" &lt;&lt;  endl;
   } else {
        cout &lt;&lt; "x  / y " &lt;&lt; setw(12) &lt;&lt; (x  / y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x / y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x / y))) &lt;&lt; endl;
   }
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x %  y " &lt;&lt; setw(12) &lt;&lt; (x  &amp; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  &amp; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  &amp; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x &lt;&lt; y " &lt;&lt; setw(12) &lt;&lt; (x &lt;&lt; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x &lt;&lt; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x &lt;&lt; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x &gt;&gt; y " &lt;&lt; setw(12) &lt;&lt; (x &gt;&gt; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x &gt;&gt; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x &gt;&gt; y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  &amp; y " &lt;&lt; setw(12) &lt;&lt; (x  &amp; y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  &amp; y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  &amp; y))) &lt;&lt; endl;
cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  | y " &lt;&lt; setw(12) &lt;&lt; (x  | y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  | y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  | y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; "x  ^ x " &lt;&lt; setw(12) &lt;&lt; (x  ^ y) &lt;&lt; " 0x" &lt;&lt; setw(8) &lt;&lt; setfill('0') &lt;&lt; hex &lt;&lt; (x  ^ y) &lt;&lt;  find(const_cast&lt;type_info*&gt;(&amp;typeid(x  ^ y))) &lt;&lt; endl;
   cout.flags(ioFlags); cout &lt;&lt; setfill(' ');
   cout &lt;&lt; endl;
}

int main(int argc, char** argv) {
   char x = -1;
   func0((char) 1);

   func1(x, (char) 1);
   func1(x, (unsigned char) 1);
   func1(x, (long) 1);
   func1(x, (unsigned long) 1);
   sleep(1);
   return 0;
}
</code></pre>
