unsigned interger overflow

qznc qznc at web.de
Wed Oct 2 01:51:42 PDT 2013


On Wednesday, 2 October 2013 at 05:41:50 UTC, Jonathan M Davis 
wrote:
> On Wednesday, October 02, 2013 12:32:24 Alexandr Druzhinin 
> wrote:
>> Is it safe to replace code:
>> 
>> uint index;
>> // do something
>> index++;
>> if(index == index.max)
>> index = index.init;
>> 
>> by the following code
>> uint index;
>> // do something
>> index++; /// I use unsigned int so uint.max changed to 0 
>> automagically
>
> Well, not quite. Your first one skips uint.max. It goes from 
> uint.max - 1 to 0,
> whereas the second one goes from uint.max to 0. So, they're 
> subtly different.
> But yes, incrementing the maximum value of an unsigned integral 
> type is
> guaranteed to wrap around to 0. Signed integers are of course 
> another matter
> entirely, but it's guaranteed to work with unsigned integers.

For signed integers there seems to be no clear consensus [0], 
although personally I would read the spec [1] as wrapping happens 
for int as well:

"If both operands are of integral types and an overflow or 
underflow occurs in the computation, wrapping will happen."

I also consider it reasonable, since every architecture uses 
2s-complement.

[0] http://forum.dlang.org/thread/jo2c0a$31hh$1@digitalmars.com
[1] http://dlang.org/expression.html


More information about the Digitalmars-d-learn mailing list