For a sample of maximum volumes, since those tend to increase the most rapidly:
* using a 32-bit integer value
- Milli scale : max Volume = 4.295 m^3 -- a 1.6255 m per dimension cube
- Centi scale : max Volume = 4294.967 m^3 -- a 16.255 m per dimension cube
* using a 64-bit integer value
- Milli scale : max Volume = 18446744073.710 m^3 -- a 2642.246 m per dimension cube (bigger than you'll probably ever need)
If you don't plan to have anything larger than the 32-bit Centi scale, but no smaller than 1 centi unit / dimension, then I'd say go with 32-bit Centi since it will give you a good range without having to muck about with decimals too much. If you need high accuracy for large values then you may need to use the 64-bit Milli value.
Density is pretty easy, with the densest known element is Osmium at 22.570 kg/m^3 (
Wiki Source). Converting from kg->mg, to keep with the Milli scale, would stay within the maximum value for 64-bit integers by a wide margin.
I'm being a little lazy and not doing the full conversion thing for each of the scales, but the results should come up similar. For any solid volume, up to the maximum volumes specified above, that is made up of known elements or materials you should be fine. If accuracy is your goal and you don't care about dealing with very large numbers and a larger memory footprint then I'll throw my vote at a 64-bit Milli scale model for everything
Hope that wasn't too long-winded, and is accurate. Running on a little too little sleep right now :S