Just weird, because of the stupid design of x86 processors. Even while with modern x86 32bits processors it is possible to address up to 4Gb, you still have to split it because the OS and the user space programs must be kept in separate areas (and I'm not even counting here the memory fragments that are used for I/O mapping, etc). Under 32bits Linux, you can configure the kernel at compile time to use 1Gb/3Gb, 2Gb/2Gb or 3Gb/1Gb splits (the default configuration being 1Gb/3Gb). Under Windows it depends on the version. With 32bits XP, the processes are normally allocated a maximum of 2Gb unless they were compiled (with a special compiler flag) to use 3Gb (this is the case for the Cool VL Viewer). So, even if you got 3.3Gb of free memory seen by the OS, only a maximum of 3Gb can be used by a single program and attempting to use more causes a crash.
Now, when running a 32bits program on a 64bits OS, the 4Gb addressing space barrier of the latter is lifted and the 32bits processes can be allocated up to 4Gb (since the program is itself 32bits, it can't address more than that).