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