Straightforward conversion from Int <-> Word

Jan-Willem Maessen
Mon, 25 Feb 2002 11:46:03 -0500

I've cast about a bit and haven't been able to find the appropriate
functionality, so I'm asking here.

I'd like to convert Int32 to and from Word32 in the good old-fashioned
bitwise fashion (perserving modular arithmetic).  I have the following
code to show what I mean:

  intToNat i
    | i >= 0    = fromIntegral i
    | otherwise = fromIntegral (i - minBound) + negBound
    where negBound = fromInteger . negate . toInteger $ (minBound :: Int)

One might think that "intToWord32" and "word32ToInt" in lang/Word
would do what I want---but no!  These are depracated, and I must use
fromIntegral, which will only perform the conversion correctly for the
portions of the numeric range which overlap.

How do I do the straightforward conversion module 2^32?  I'm sure it's
buried in there somewhere...  I can't even turn up an appropriate type
signature, though.

-Jan-Willem Maessen