Rebol3 Code Examplex


Integer overflow

Demonstrate or detect arithmetic overflow in integer types.

Rebol [
    title: "Rosetta code: Integer overflow"
    file:  %Integer_overflow.r3
    url:   https://rosettacode.org/wiki/Integer_overflow
]

foreach expr [
    ;; For 32-bit signed integers:
    [negate (-2147483647 - 1)                  ]
    [2000000000 + 2000000000                   ]
    [-2147483647 - 2147483647                  ]
    [46341 * 46341                             ]
    [(-2147483647 - 1) / -1                    ]
    ;; For 64-bit signed integers:
    [negate (-9223372036854775807 - 1)         ]
    [5000000000000000000 + 5000000000000000000 ]
    [-9223372036854775807 - 9223372036854775807]
    [3037000500 * 3037000500                   ]
    [(-9223372036854775807 - 1) / -1           ]
    ;; For 32-bit unsigned integers:
    [-4294967295                               ]
    [3000000000 + 3000000000                   ]
    [2147483647 - 4294967295                   ]
    [65537 * 65537                             ]
    ;; For 64-bit unsigned integers:
    [transcode "-18446744073709551615"         ]
    [transcode " 10000000000000000000"         ]
    [transcode " 18446744073709551615"         ]
    [4294967296 * 4294967296                   ]
][
    prin [pad mold/only expr 44 ";== "]
    print either error? res: try expr [as-red reform [res/type res/id]][res]
]

Output:

negate (-2147483647 - 1)                     ;== 2147483648
2000000000 + 2000000000                      ;== 4000000000
-2147483647 - 2147483647                     ;== -4294967294
46341 * 46341                                ;== 2147488281
(-2147483647 - 1) / -1                       ;== 2147483648
negate (-9223372036854775807 - 1)            ;== Math overflow
5000000000000000000 + 5000000000000000000    ;== Math overflow
-9223372036854775807 - 9223372036854775807   ;== Math overflow
3037000500 * 3037000500                      ;== Math overflow
(-9223372036854775807 - 1) / -1              ;== Math overflow
-4294967295                                  ;== -4294967295
3000000000 + 3000000000                      ;== 6000000000
2147483647 - 4294967295                      ;== -2147483648
65537 * 65537                                ;== 4295098369
transcode "-18446744073709551615"            ;== Syntax invalid
transcode " 10000000000000000000"            ;== Syntax invalid
transcode " 18446744073709551615"            ;== Syntax invalid
4294967296 * 4294967296                      ;== Math overflow