Is there a formula for overflow?
Basile B.
b2.temp at gmx.com
Wed Nov 30 03:19:49 UTC 2022
On Wednesday, 30 November 2022 at 03:07:44 UTC, thebluepandabear
wrote:
> I am reading through Ali's book about D, and he gives the
> following examples for an overflow:
>
> ```D
> import std.stdio;
> void main() {
> // 3 billion each
> uint number_1 = 3000000000;
> uint number_2 = 3000000000;
> }
> writeln("maximum value of uint: ", uint.max);
> writeln("
> number_1: ", number_1);
> writeln("
> number_2: ", number_2);
> writeln("
> sum: ", number_1 + number_2);
> writeln("OVERFLOW! The result is not 6 billion!");
> ```
writeln((3000000000LU + 3000000000LU) % uint.max);
> The result overflows and is 1705032704.
>
> Also for the second example, it overflows and comes up with the
> value of 4294967286:
>
> ```D
> void main() {
> uint number_1 = 10;
> uint number_2 = 20;
> writeln("PROBLEM! uint cannot have negative values:");
> writeln(number_1 - number_2);
> writeln(number_2 - number_1);
> }
> ```
>
> Also a fun one, the following produces 4294967295:
>
> ```D
> uint number = 1;
> writeln("negation: ", -number);
> ```
writeln( cast(uint) -(cast(int)1) );
> But the book doesn't talk about why the D compiler came up with
> these results (and it also goes for division/multiplication)
> for the overflow (or maybe it did further down ?), as in it
> didn't talk about the formula it used for calculating this
> value.
>
> I am curious as to what formula the D compiler uses for
> calculating 'overflowed' values, if such thing exists? :)
>
> Regards,
> thebluepandabear
It's always a wraparound (think modulo) but your examples with
negative number can be explained because there are hidden
unsigned to signed implicit convertions.
That the only special things D does.
More information about the Digitalmars-d-learn
mailing list