The difference is that the 4 is the area's ID number, that is, the primary key in the database. The 56 is the room's database ID. A vnum is a class containing a pointer to the area and an unsigned integer with the room's ID within the area. Several rooms may have the same ID as long as the area is different. So each area has its own private range of possible rooms, potentially 4 billion each. While this number is huge, it does allow an area to expand gradually without ever crashing with another area's vnum range.
It also makes it easy to create instanced zones such as ships, assault courses, quest areas, etc. The reason it's easy is because you don't need to renumber the rooms, exits, resets, etc. Just a matter of copying all the data from the template area and alter their vnum with the new area ID.
Here's an example of how all the rooms in an area is copied to a new area using only SQL:
query << "INSERT INTO room( area_id, room_id, room_name, description, night_description, room_flags, sector, max_persons ) "
<< " SELECT " << GetId() << ", room_id, room_name, description, night_description, room_flags, sector, max_persons "
<< " FROM room "
<< " WHERE area_id = " << source->GetId() << ";";
Notice how the room table contains both an area_id and a room_id. Together these serve as the primary key. This is one query even though it uses both INSERT and SELECT. The results of the SELECT (which fetches the data of the old rooms) is fed into the INSERT while altering the area_id (with the GetId() function) resulting in a range of new rooms which are identical to the original in every way except the area it belongs to has changed. The "original" would be the ship template area as described in my first post, and the new data would be the new instanced ship.
The colon serves to distinguish the area ID from the room ID when using in-game commands. Nothing else. The implementation is the Vnum class as mentioned above.
I hope this clarifies things.