Treating the abusive unsigned syndrome

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Nov 26 13:57:55 PST 2008


Sergey Gromov wrote:
> Wed, 26 Nov 2008 09:12:12 -0600, Andrei Alexandrescu wrote:
> 
>> Don wrote:
>>> My suspicion is, that if you allowed all signed-unsigned operations when 
>>> at least one was a literal, and made everything else illegal, you'd fix 
>>> most of the problems. In particular, there'd be a big reduction in 
>>> people abusing 'uint' as a primitive range-limited int.
>> Well, part of my attempt is to transform that abuse into legit use. In 
>> other words, I do want to allow people to consider uint a reasonable 
>> model of natural numbers. It can't be perfect, but I believe we can make 
>> it reasonable.
>>
>> Notice that the fact that one operand is a literal does not solve all of 
>> the problems I mentioned. There is for example no progress in typing u1 
>> - u2 appropriately.
>>
>>> Although it would be nice to have a type which was range-limited, 'uint' 
>>> doesn't do it. Instead, it guarantees the number is between 0 and 
>>> int.max*2+1 inclusive. Allowing mixed operations encourages programmers 
>>> to focus the benefit of 'the lower bound is zero!' while forgetting that 
>>> there is an enormous downside ('I'm saying that this could be larger 
>>> than int.max!')
>> I'm not sure I understand this part. To me, the larger problem is 
>> underflow, e.g. when subtracting two small uints results in a large uint.
> 
> I'm totally with Don here.  In math, natural numbers are a subset if
> integers.  But uint is not a subset of int.  If it were, most of the
> problems would vanish.  So it's probably feasible to ban uint from
> SafeD, implement natural numbers by some other means, and leave uint for
> low-level wizardry.

That's also a possibility - consider unsigned types just "bags of bits" 
and disallow most arithmetic for them. They could actually be eliminated 
entirely from the core language because they can be implemented as a 
library. I'm not sure how that would feel like.

I guess length would return an int in that case?

Andrei



More information about the Digitalmars-d mailing list