'int' is enough for 'length' to migrate code from x86 to x64

Don via Digitalmars-d digitalmars-d at puremagic.com
Fri Nov 21 08:12:19 PST 2014


On Friday, 21 November 2014 at 15:50:05 UTC, H. S. Teoh via 
Digitalmars-d wrote:
> On Fri, Nov 21, 2014 at 03:36:01PM +0000, Don via Digitalmars-d 
> wrote:
> [...]
>> Suppose  D had a type 'natint', which could hold natural 
>> numbers in
>> the range 0..uint.max.  Sounds like 'uint', right? People make 
>> the
>> mistake of thinking that is what uint is. But it is not.
>> 
>> How would natint behave, in the type system?
>> 
>> typeof (natint - natint)  ==  int     NOT natint  !!!
>
> Wrong. (uint.max - 0) == uint.max, which is of type uint.


It is not uint.max. It is natint.max. And yes, that's an overflow 
condition.

Exactly the same as when you do int.max + int.max.

> If you
> interpret it as int, you get a negative number, which is wrong. 
> So your
> proposal breaks uint in even worse ways, in that now 
> subtracting a
> smaller number from a larger number may overflow, whereas it 
> wouldn't
> before. So that fixes nothing, you're just shifting the problem
> somewhere else.
>
>
> T

This is not a proposal!!!! I am just illustrating the difference 
between what people *think* uint does, vs what it actually does.

The type that I think would be useful, would be a number in the 
range 0..int.max.
It has no risk of underflow.

To put it another way:

natural numbers are a subset of mathematical integers.
   (the range 0..infinity)

signed types are a subset of mathematical integers
   (the range -int.max .. int.max).

unsigned types are not a subset of mathematical integers.

They do not just have a restricted range. They have different 
semantics.


The question of what happens when a range is exceeded, is a 
different question.




More information about the Digitalmars-d mailing list