Portability of uint over/underflow behavior

Don nospam at nospam.com
Mon Jan 5 02:29:45 PST 2009


bearophile wrote:
> Don:
>> The question was about incrementing uint, not int. Preventing wraparound 
>> on uints would break everything!
> 
> If optional runtime overflow controls are added to integral values, then they are performed on ubyte/ushort/uint/ulong/ucent too, because leaving a hole in that safety net is very bad and useless.

But uints HAVE no overflow! In the case of an int, you are approximating 
a mathematical infinite-precision integer. An overflow means you went 
outside the available precision.
A uint is quite different.
uint arithmetic is perfectly standard modulo 2^32 arithmetic.
Don't be confused by the fact that many people use them as 
approximations to infinite-precision positive integers. That's _not_ 
what they are.

Consider for example machine addresses on a 32-bit address bus.
Given pointers p and q,
p + q - p is perfectly well defined, and is always equal to q.
It makes no difference whether p is greater than or less than q.
q-p is definitely not an int. (q could be uint.max, and p could be 0).
Likewise, p+1 is always defined, even if p is uint.max (p+1 will then be 0).


> In modules where you need wraparounds, you can tell the compiler to disable such controls (recently I have suggested a syntax that works locally: safe(...) {...}, but Walter seems to prefer a module-level syntax for this).


> 
> Bye,
> bearophile



More information about the Digitalmars-d mailing list