unsigned interger overflow

monarch_dodra monarchdodra at gmail.com
Wed Oct 2 02:15:00 PDT 2013


On Wednesday, 2 October 2013 at 08:51:43 UTC, qznc wrote:
> 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

I re-read the thread. AFAIK, C++ makes no promises for signed 
overflow/underflow, because it targets both 1's complement and 
2's complement architecture, where the behavior of *flow differs 
for signed types.

Last time I read TDPL, I *seem* to remember that it stated that D 
targeted *exclusively* 2's complement architechture. So I'd 
conclude that, even if it is not *specified*, the only logical 
behavior for signed under/over flow, is to jump from from .min to 
.max


More information about the Digitalmars-d-learn mailing list