Treating the abusive unsigned syndrome

Lars Kyllingstad public at kyllingen.NOSPAMnet
Wed Nov 26 15:06:55 PST 2008


Lars Kyllingstad wrote:
> Andrei Alexandrescu wrote:
>> Sean Kelly wrote:
>>> Andrei Alexandrescu wrote:
>>>>
>>>> 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.
>>>
>>> What /is/ the appropriate type here?  For example:
>>>
>>>     uint a = uint.max;
>>>     uint b = 0;
>>>     uint c = uint.max - 1;
>>>
>>>     int  x = a - b; // wrong, should be uint
>>>     uint y = c - a; // wrong, should be int
>>>
>>> I don't see any way to reliably produce a "safe" result at the 
>>> language level.
>>
>> There are several schools of thought (for the lack of a better phrase):
>>
>> 1. The Purist Mathematician: We want unsigned to approximate natural 
>> numbers, natural numbers aren't closed for subtraction, therefore u1 - 
>> u2 should be disallowed.
>>
>> 2. The Practical Mathematician: we want unsigned to approximate 
>> natural numbers and natural numbers aren't closed for subtraction but 
>> closed for a subset satisfying u1 >= u2. We can rely on the programmer 
>> to check the condition before, and fall back on modulo difference when 
>> the condition isn't satisfied. They'll understand.
> 
> How about 1.5, the Somewhat Practical but Still Purist Mathematician? He 
> (that would be me) would like integral types called nint and nlong (the 
> "n" standing for "natural"), which can hold numbers in the range (0, 
> int.max) and (0, long.max), respectively. Such types would have to be 
> stored as int/long, but the sign bit should be ignored/zero in all 
> calculations. Hence any nint/nlong would be implicitly castable to 
> int/long. Is this a possibility?
> 
> As you say, natural numbers aren't closed under subtraction, so 
> subtractions involving nint/nlong would have to yield an int/long 
> result. In fact, if n1 and n2 are nints, one would be certain that n1-n2 
> never goes out of the range of an int.
> 
> Thing is, whenever I use one of the unsigned types, it is because I need 
> to make sure I'm working with nonnegative numbers, not because I need to 
> work outside the ranges of the signed integral types. Other people 
> obviously have other needs, though, so I'm not saying "let's toss uint 
> and ulong out the window".
> 
> -Lars

Another point: nint would also be implicitly castable to uint and so on, 
so making these types the standard choice of unsigned integers in Phobos 
shouldn't cause too much breakage.

-Lars



More information about the Digitalmars-d mailing list