struct
    exception Overflow

    let ( + ) a b =
      let c = a + b in
      if (a lxor b) lor (a lxor (lnot c)) < 0 then c else raise Overflow

    let ( - ) a b =
      let c = a - b in
      if (a lxor (lnot b)) lor (b lxor c) < 0 then c else raise Overflow

    let ( * ) a b =
      let c = a * b in
      if Int64.of_int c = Int64.mul (Int64.of_int a) (Int64.of_int b)
      then c else raise Overflow

    let ( / ) a b =
      if a = min_int && b = -1 then raise Overflow else a / b

    let ( ~- ) x =
      if x <> min_int then -x else raise Overflow

  end