'int' is enough for 'length' to migrate code from x86 to x64
via Digitalmars-d
digitalmars-d at puremagic.com
Sun Nov 23 00:55:43 PST 2014
On Friday, 21 November 2014 at 16:12:19 UTC, Don wrote:
> 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.
This depends on how you look at it. From a formal perspective
assume zero as the base, then a predecessor function P and a
successor function S.
Then you have 0u - 1u + 2u ==> SSP0
Then you do a normalization where you cancel out successor and
predecessor pairs and you get the result S0 ==> 1u. On the other
hand if you end up with P0 the result should be bottom (error).
In binary representation you need to collect the carry over N
terms, so you need an extra accumulator which you can get by
extending the precision by ~ log2(N) bits. Then do a masking of
the most significant bits to check for over/underflow.
Advanced for a compiler, but possible.
> The type that I think would be useful, would be a number in the
> range 0..int.max.
> It has no risk of underflow.
Yep, from a correctness perspective length should be integer with
a >=0 constraint. Ada also acknowledge this by having unsigned
integers being 31 bits like you suggest. And now that most CPUs
go 64 bit then a 63 bit integer would be the right choice for
array length.
> 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.
There is really no difference between signed and unsigned in
principle since you only have an offset, but in practical
programming 64 bits signed and 63 bits unsigned is enough for
most situations with the advantage that you have the same bit
representation with only one interpretation.
What the semantics are depend on how you define the operators,
right? So you can have both modular arithmetic and non-modular in
the same type by providing more operators. This is after all how
the hardware does it.
Contrary to what is claimed by others in this thread the general
hardware ALU does not default to modular arithmetic, it preserves
resolution:
32bit + 32bit ==> 33bit result
32bit * 32bit ==> 64bit result
Modular arithmetic is an artifact of the language, not the
hardware.
More information about the Digitalmars-d
mailing list