Visual C++
Common Visual C++ 64-bit Migration Issues

When you use Visual C++ to create applications to run on a 64-bit Windows operating system, you should be aware of the following issues:

  • An int and a long are 32-bit values on 64-bit Windows operating systems. For programs that you plan to compile for 64-bit platforms, you should be careful not to assign pointers to 32-bit variables. Pointers are 64-bit on 64-bit platforms, and you will truncate the pointer value if you assign it to a 32-bit variable.

  • size_t, time_t, and ptrdiff_t are 64-bit values on 64-bit Windows operating systems.

  • time_t is a 32-bit value on 32-bit Windows operating systems in Visual C++ versions before Visual C++ 2005. In Visual C++ 2005 and later, time_t is a 64-bit integer by default. For more information, see Time Management.

    You should be aware of where your code takes an int value and processes it as a size_t or time_t value. It is possible that the number could grow to be larger than a 32-bit number and data will be truncated when it is passed back to the int storage.

The %x (hex int format) printf modifier will not work as expected on a 64-bit Windows operating system. It will only operate on the first 32 bits of the value that is passed to it.

  • Use %I32x to display an integer on a Windows 32-bit operating system.

  • Use %I64x to display an integer on a Windows 64-bit operating system.

  • The %p (hex format for a pointer) will work as expected on a 64-bit Windows operating system.

For more information, see:

See Also

Other Resources

Tags :


Community Content

David Lowndes
The %x section of this article is incorrect
Since in Win64, int and long are only 32-bit values anyway!
Tags :

ipoverscsi
The %x section of this article is technically correct
Both int and size_t are integer quantities; the only difference is how many bits it requires to represent them. Do not forget that char and short are also integer quantities. The reason the %x format specifier works on all integer types of 32-bits or less is because the compiler implicitly promotes char and short data types to int when passed as a parameter to a function. This should explain why only the first 32-bits of a 64-bit integer are processed by the %x format specifier -- it assumes the parameter it is formatting is 32-bits in length. The reason for the addition of the new %I32x and %I64x format specifiers is to allow the compiler to perform parameter validation on printf()-style functions for 32-bit and 64-bit integer types, respectively. Using the plain %x specifier when compiling a 64-bit application will likely generate a warning.

Tags :

Page view tracker