8051 with Keil-C filesize issue using a Megawin processor
A hex file can skip 'don't care' locations by restarting at a new address (on each line, in general), so the hex file size might be considerably smaller than the binary bytes if there's a bit of content at the bottom of the address space and more content at the top. It doesn't mean that the files are not effectively identical. The line length also can vary between hex files and still represent the exact same data (since there is overhead per line, longer lines will give you a smaller file). 

As to why Keil would choose to allocate program memory (or constants etc.) starting at the bottom or the top, bottom, or middle of the memory in the emitted code, I don't see why you'd care.. that's why you're using a high level language in the first place. So long as the compiler knows the correct memory range for the target, all should be well.