Я делал операцию в C ++ над структурой таймера Linux, предоставленной интерфейсом «Clock_gettime (CLOCK_MONOTONIC, &Текущее время)»
#include <iostream>
#include <time.h>
int main()
{
struct timespec CurrentTime;
CurrentTime.tv_sec = 28220;
CurrentTime.tv_nsec = 461189000;
unsigned long long TimeNow;
TimeNow = (28220 * 1000000) + (461189000 * 0.001);
std::cout << TimeNow;
}
но результат всегда дает TimeNow как ноль.
Я был бы признателен, если у кого-либо есть ответ на этот вопрос или руководство для подражания.
Это было сделано с помощью компилятора GCC
Код Snipped можно найти здесь
http://rextester.com/XRR83683
В соответствии:
TimeNow = (28220 * 1000000) + (461189000 * 0.001);
(28220 * 1000000)
часть рассчитывается с использованием int
с, и (с 32-разрядным int
) переполняется, давая неправильное значение (вероятно, -1844771072).
(461189000 * 0.001)
часть рассчитывается с использованием double
с, из-за 0.001
двойная константа, давая 461189.0 как double
,
Два затем складываются вместе, давая отрицательный double
значение … когда это отрицательное double
преобразуется в unsigned long long
для назначения TimeNow
, он конвертируется как 0, вероятно, потому что это самое близкое значение в его диапазоне к любому отрицательному числу. Это отличается от преобразования отрицательного целочисленного типа в unsigned, который будет «обтекать».
Других решений пока нет …