As Jon describes, NAT (or possibly PAT).
Normally, each PC will "see" the other host as having a public IP. In fact, if using PAT, all external hosts to each private address space's hosts will "see" all hosts coming from the public IPs you mentioned. With PAT, each internal PC's flows will be "mapped" to a unique port number (if TCP or UDP). The latter, though, as it's generally assigned dynamically, will make it very difficult for any "external" host to reach an "internal" host, as often hosts generally don't know what port number(s) to use. This can be dealt with if some port numbers are pre-assigned and reserved or just NAT is used with pre-assigned and reserved public IPs that "map" to specific internal host private IPs.
You might also support private IP host to private host IP using some external server that both "register" to. I.e. private IP host to another private IP host communication can be done, across the Internet, but it takes a bit of work.