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.

Further reading