use long long to guarantee at least 64 bits in size