Why do shift operators undergo integral promotion?

Don nospam at nospam.com
Tue Aug 9 02:46:51 PDT 2011


 From a discussion on D.learn.

If x and y are different integral types, then in an expression like
   x >> y
the integral promotion rules are applied to x and y.
This behaviour is obviously inherited from C, but why did C use such a 
counter-intuitive and bug-prone rule?
Why isn't typeof(x >> y) simply typeof(x) ?
What would break if it did?

You might think the the rule is that typeof( x >> y) is typeof( x + y),
but it isn't: the arithmetic conversions are NOT applied:
typeof(int >> long) is int, not long, BUT
typeof(short >> int) is int.
And we have this death trap (bug 2809):

void main()
{
   short s = -1;
   ushort u = s;
   assert( u == s );
   assert ( (s >>> 1) == (u >>> 1) ); // FAILS
}


More information about the Digitalmars-d mailing list