'int' is enough for 'length' to migrate code from x86 to x64
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Fri Nov 21 10:11:48 PST 2014
On Friday, 21 November 2014 at 16:12:19 UTC, Don wrote:
> 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.
I was under the impression that in D:
uint = { x mod 2^32 | x ∈ Z_0 }
int = { x - 2^31 | x ∈ uint }
which matches the hardware.
More information about the Digitalmars-d
mailing list