title: Why is this expression being unsigneded?
body: <p>On x86_64 CentOS 7 GCC 4.8.5 C++11:</p>
  
  <pre><code>#include &lt;iostream&gt;
  
  int main()
  {
      std::cout &lt;&lt; ((ssize_t)1 - (size_t)5) &lt;&lt; '\n';
  }
  
  // Output: 18446744073709551612
  </code></pre>
  
  <p>But:</p>
  
  <pre><code>#include &lt;iostream&gt;
  
  int main()
  {
      std::cout &lt;&lt; ((ssize_t)1 - (unsigned int)5) &lt;&lt; '\n';
  }
  
  // Output: -4
  </code></pre>
  
  <p>And on i686 CentOS 6 GCC 4.8.2 C++11, they both give <code>4294967292</code> so I have to do this:</p>
  
  <pre><code>#include &lt;iostream&gt;
  
  int main()
  {
      std::cout &lt;&lt; ((ssize_t)1 - (ssize_t)5) &lt;&lt; '\n';
  }
  
  // Output: -4
  </code></pre>
  
  <p>An extremely contrived example, obviously, and I understand that I'm hitting various clauses in the integral promotion rules depending on the platform/implementation-defined type equivalences, but on a Thursday my brain can't unravel them for a rigourous assessment.</p>
  
  <p>What exactly is the sequence of standard rules that leads me to these results?</p>