Is there a simple way to compile 32-bit C code into a 64-bit application, with minimal modification? The code was not setup to use fixed type sizes.
I am not interested in taking advantage of 64-bit memory addressing. I just need to compile into a 64-bit binary while maintaining 4 byte longs and pointers.
Something like:
#define long int32_t
But of course that breaks a number of long use cases and doesn’t deal with pointers. I thought there might be some standard procedure here.
There seem to be two orthogonal notions of “portability”:
My code compiles everywhere out of the box. Its general behaviour is the same on all platforms, but details of available features vary depending on the platform’s characteristics.
My code contains a folder for architecture-dependent stuff. I guarantee that MYINT32 is always 32 bit no matter what. I successfully ported the notion of 32 bits to the nine-fingered furry lummoxes of Mars.
In the first approach, we write
unsigned int n;andprintf("%u", n)and we know that the code always works, but details like the numeric range ofunsigned intare up to the platform and not of our concern. (Wchar_t comes in here, too.) This is what I would call the genuinely portable style.In the second approach, we typedef everything and use types like
uint32_t. Formatted output withprintftriggers tons of warnings, and we must resort to monsters likePRI32. In this approach we derive a strange sense of power and control from knowing that our integer is always 32 bits wide, but I hesitate to call this “portable” — it’s just stubborn.The fundamental concept that requires a specific representation is serialization: The document you write on one platform should be readable on all other platforms. Serialization is naturally where we forgo the type system, must worry about endianness and need to decide on a fixed representation (including things like text encoding).
The upshot is this:
If you stick to that, you should never even have to think about whether your platform is 32 or 64 bit, big or little endian, Mac or PC, Windows or Linux. Stick to the standard, and the standard will stick with you.