The block reward code is as follows:
int64 static GetBlockValue(int nHeight, int64 nFees)
{
int64 nSubsidy = 524288 * COIN;
// Subsidy is cut in half every 86400 blocks, which will occur approximately every 1 month
nSubsidy >>= (nHeight / 86400); // Infinitecoin: 86400 blocks in ~1 month
return nSubsidy + nFees;
}
The halving is every month (based on 30 second blocks). After 64 months, the halving number appears to return to 0 based on the undefined behavior of a 64bit number being right shifted 64 bits.
According to the C++ language, this operation has undefined results -- this means that the result could be different on different machines/CPU's.
If there are differences this could lead to forks or clients and apps that do not sync past 5529600.
This will require a hard fork fix on the code above. At a certain block height in the future, this code would be modified to force the reward to be zero.