So far we had a single canister change subnets ever. You can read more about it here.
Obviously that would mean that canister id ranges can change. Depending on the implementation that would be more or less often
It is already exposed on chain: The registry has an endpoint that will tell you which subnet a certain canister ID belongs to (no matter if the canister actually exists or not)