I believe most programmers are aware of these options, many still lack a whole clear picture of these options. I would like to document and share some points to clear away confusion.
First, we should talk about the OS, earlier, Windows OS was dominating the market with 32-bit OS until AMD invented a first 64-bit processor ever. So, the OS continued evolving over the years, from 16-bit OS to 32-bit (x86) and years ago to 64-bit (x64).
64-bit OS vs 32-bit OS, What’s the difference?
To understand this, let’s understand the capabilities of both 32-bit and 64-bit CPUs.
- 32-bit CPU: Address pointer size is 32 bits which can access 2³² (4,294,967,296) discrete addresses. This allows a program to make a data structure in memory up to 4 GB in size.
- 64 bit CPU: Address pointer size is 64 bits which can access 2⁶⁴ (18,446,744,073,709,551,616) discrete addresses. This allows a program to make a data structure in memory up to 16 Exabytes in size.
- Key Points: Processes on a 64-bit CPU can work with a larger set of data compared to 32-bit CPU besides the constraint by physical memory. A 64-bit integer makes arithmetic or logical operations using 64-bit types such as C#’s
long
faster than one implemented as two 32 bit operations. - Summary: Applications that use large amounts of memory, like software process images and videos, 3D rendering utilities, and video games will make better use of a 64-bit architecture and OS, especially if the machine has 8 or even 16 GB of RAM that can be divided among the applications that need it.
The behavior of 32-bit, 64-bit and Any CPU EXEs
In Visual Studio IDE, there are three options for compilation: x86, x64 and AnyCPU, what happens when you run different compiled process executables on a 32-bit and 64-bit machine?
On a 32-bit machine:
- Any CPU: Runs as a 32-bit process, can load Any CPU and
x86
assemblies(dlls, libs) , will getBadImageFormatException
if it tries to load anx64
assembly. - Any CPU-32-bit preferred (default): Same as Any CPU.
- x86: Same as Any CPU.
- x64:
BadImageFormatException
always.
On a 64-bit machine:
- Any CPU: Runs as a 64-bit process, can load Any CPU and
x64
assemblies, will getBadImageFormatException
if it tries to load anx86
assembly. - Any CPU-32-bit preferred (default): Runs as a 32-bit process, can load Any CPU and
x86
assemblies, will getBadImageFormatException
if it tries to load anx64
assembly. - x86: Runs as a 32-bit process, can load Any CPU and
x86
assemblies, will getBadImageFormatException
if it tries to load anx64
assembly. - x64: Same as Any CPU.
So, if we don’t know the target machine is 32-bit, 64-bit or both, we can compile our executables as 32-bit, and the assemblies as Any CPU.