[The result of converting a pointer to an integer or
vice versa (6.3.2.3).]

A cast from pointer to integer discards most-significant bits if the
pointer representation is larger than the integer type,
sign-extends[1]
if the pointer representation is smaller than the integer type, otherwise
the bits are unchanged.

A cast from integer to pointer discards most-significant bits if the
pointer representation is smaller than the integer type, extends according
to the signedness of the integer type if the pointer representation
is larger than the integer type, otherwise the bits are unchanged.

When casting from pointer to integer and back again, the resulting
pointer must reference the same object as the original pointer, otherwise
the behavior is undefined. That is, one may not use integer arithmetic to
avoid the undefined behavior of pointer arithmetic as proscribed in 6.5.6/8.