On Thursday, 5 November 2015 at 13:23:34 UTC, Adam D. Ruppe wrote:
On Thursday, 5 November 2015 at 10:07:30 UTC, Dominikus Dittes
Scherkl wrote:
ubyte b = 1u;
auto c = b + 1u;
I expect the 1u to be of type ubyte - and also c.
This won't work because of the one-expression rule. In the
second line, it doesn't know for sure what b is, it just knows
it is somewhere between 0 and 255. So it assumes the worst,
that it is 255, and you add one, giving 256... which doesn't
fit in a byte.
That would be fine - but c is not ushort (which the worst-case
256 would fit in), not even uint, but int! A signed type! Just
because of the crazy C interger propagation rules!
And, ok, one needs to accept that auto may not do exactly what I
wish for, but if I give an exact type that is likely to fit (and
has to if all operands are of the same type), I expect it to work
without extra casts:
ubyte d = b + 1u; // doesn't compile
ubyte d = b + (ubyte)1; // works - and overflows to 0 if b is 255