Well...
- there's the physical RAM on your motherboard(*).
- minus the part reserved for on-board graphics (if present), either by the BIOS or the OS (
https://en.wikipedia.org/wiki/Graphics_processing_unit#Integrated_graphics )
- minus the part for specific hardware requirements(
https://support.microsoft.com/en-gb/help/978610/the-usable-memory-may-be-less-than-the-installed-memory-on-windows-7-b )
- minus the part reserved for OS use only.
What remains is available to use by user-land processes, but not directly!
On a modern OS like Windows, Linux, MacOS, the memory seen by any user-space program is virtual memory.
So whilst you may have done
int *large = new int[10000000];, your program isn't instantly the exclusive owner of another 50MB of RAM. It's the owner of 50MB of it's own virtual address space.
It's only when you try to use the memory that the OS will physically map real RAM to your process.
https://docs.microsoft.com/en-us/windows/desktop/memory/working-set
The working set (the memory dedicated to your process at one particular moment) is a very fluid thing, depending on what your program is doing and the overall load on the system).
So, what are you trying to measure?
(*) and if you're booting into a virtual machine like VMWare or VirtualBox, then even that is a smoke and mirrors value.