let cast ~size ~signed ~value =
    let factor = two_power size in
    let mask = two_power (sub size one) in

    if (not signed) then pos_rem value factor
    else
      if equal (logand mask value) zero
    then logand value (pred mask)
    else
      logor (lognot (pred mask)) value