

How to correctly cast a pointer to int in a 64-bit application? - ProgC
http://www.viva64.com/en/k/0005/

======
fexl
It might not work with an int, but I'm virtually certain it works with a long
int. I say that because I had to research whether I could use a long value as
both a reference count when a struct was in use, and a free list pointer when
a struct was not in use. I didn't want to declare the field as a clunky union,
but as simply "long".

I researched the issue in the C Language Reference Manual, document
007-0701-150, available on the web as a PDF. Here are my notes:

"In the value structure, the reference count N is a long int, which guarantees
that it can also be used as a pointer to link unused values on the free list,
without my having to use a cumbersome union type.

The standard says:

    
    
      long ints are large enough to hold pointers in -n32 and -o32 mode.  Both are
      32 bits wide.
    
      long ints are large enough to hold pointers in -64 mode.  Both are 64 bits
      wide.
    

(C Language Reference Manual, document 007-0701-150, Appendix A, Section F.3.7
"Arrays and Pointers")

Assuming there are no other modes, I conclude that long ints are large enough
to hold pointers, period.

As further evidence, the section titled "Integer and Floating Point Types" has
a table of Storage Class Sizes which lists the size in bits for the various
types in all three modes -o32, -n32, and -64. In all modes the size of a long
equals the size of a pointer."

