A small addition though: although the operating system can address more than 4GiB of memory (up to 64 GiB) in PAE-enabled 32-bit x86 CPUs, the user-space applications are still limited to 4GiB of virtual address space and can't address more than that.
But I don't see how it's related to the default base address chosen by linkers being 0x00400000. It's just a field in the PE header and can be easily changed.
Sure you need to (unless it's some kind of a base independent code like a well-written shellcode). I was just saying that 0x00400000 isn't hard-coded in the x86 architecture or in Windows and it can be set to anything (aligned to 0x10000 boundary).
But I don't see how it's related to the default base address chosen by linkers being 0x00400000. It's just a field in the PE header and can be easily changed.