Нет необходимости использовать uint64_t
здесь - unsigned long long
гарантированно имеет ширину не менее 64 бит.
Вам также не нужно переходить к double
и обратно, поскольку NTP_SCALE_FRAC * 1000000
легко поместится в unsigned long long
.
EPOCH
должно быть unsigned long long
, а не unsigned long
, так что добавление с tv.tv_sec
не переносится.
Всего:
const unsigned long long EPOCH = 2208988800ULL;
const unsigned long long NTP_SCALE_FRAC = 4294967296ULL;
unsigned long long tv_to_ntp(struct timeval tv)
{
unsigned long long tv_ntp, tv_usecs;
tv_ntp = tv.tv_sec + EPOCH;
tv_usecs = (NTP_SCALE_FRAC * tv.tv_usec) / 1000000UL;
return (tv_ntp << 32) | tv_usecs;
}