32-bit vs 64-bit systems
Preface
I remember early PCs were 32-bit; around Windows 7 they gradually shifted to 64-bit, but I still didn’t fully understand the differences. I only recall a period when two software builds were offered, or some programs needed to run in “compatibility mode.”
32-bits vs 64-bits systems
Program execution requires memory, and the “bits” here refer to the CPU registers’ size. For example, when computing a + b the CPU first loads the values of a and b into registers. The CPU uses addresses to know where data is stored, and the register size directly affects:
- How much data the CPU can process at once
- The range of integers that can be represented
- How much memory can be addressed
Addressing limits
- 32-bits addressing space: 2^32=4294967296, 4,294,967,296 bytes ≈ 4 GB
- 64-bits addressing space: 2^64=18446744073709551616, 18,446,744,073,709,551,616 bytes ≈ 16 EB (Exabytes)
That is why 32-bit systems are limited to around 4 GB of RAM. Modern software, which consumes more memory, is built for 64-bits. The 64-bit is backward compatible with 32-bit software, but not vice versa, because they use different instruction sets and memory layouts.
Generational improvements
On PCs and servers, 64-bit has overwhelmingly won out; 32-bit is largely historical. Architectures also gained better features:
- SSE2 (stronger floating-point / SIMD operations)
- More general-purpose registers
- Improved calling conventions
However, in embedded scenarios 32-bit continues to evolve on its own path, where 64-bit can be unnecessary overhead.
Naming
x86 was named after ancestor processors like 80?86, using the algebraic “x” to replace the digit. x64 represents the 64-bit extension of the x86 architecture, also called x86-64.