On Wednesday, 9 July 2014 at 17:13:21 UTC, H. S. Teoh via
Digitalmars-d-learn wrote:
For the comparison s < u, where s is a signed value and u is an
unsigned
value, whenever s is negative, the return value of opCmp must be
negative. Assuming 2's-complement representation of integers,
this
means we simply copy the MSB of s (i.e., the sign bit) to the
result. So
we can implement s < u as:
enum signbitMask = 1u << (s.sizeof*8 - 1); // this is a
compile-time constant
return (s - u) | (s & signbitMask); // look ma, no branches!
This is a problem, isn't it:
void main()
{
assert(cmp(0, uint.max) < 0); /* fails */
}
int cmp(int s, uint u)
{
enum signbitMask = 1u << (s.sizeof*8 - 1); // this is a
compile-time constant
return (s - u) | (s & signbitMask); // look ma, no branches!
}