Я тестирую таймер на основе библиотеки ctime с помощью функции clock ().
Обратите внимание, что следующий код предназначен только для целей тестирования.
#include <ctime>
unsigned long Elapsed(void);
clock_t start = 0;
clock_t stop = 0;
int main()
{
start = std::clock();
while(1)
{
sleep(1);
cout << "Elapsed seconds: " << Elapsed() << endl;
}
return 0;
}
unsigned long Elapsed()
{
stop = std::clock();
clock_t ticks = stop - start;
double seconds = (double)ticks / CLOCKS_PER_SEC; //CLOCK_PER_SEC = 1 milion
return seconds;
}
Как вы можете видеть, я выполняю неявное преобразование из double в unsigned long, когда Elapsed () возвращает вычисленное значение.
Длинный предел без знака для 32-битной системы составляет 2 147 483 647, и я получаю переполнение после того, как Elapsed () вернет 2146.
Похоже, что функция преобразует "тики" в unsigned long, CLOCK_PER_SEC в unsigned long, а затем возвращает значение. Когда он преобразует «тики», он переполняется.
Я ожидал, что вместо этого сначала вычислю значение в двойном значении "ticks" / CLOCK_PER_SEC, а затем преобразую его в unsigned long.
В попытке подсчитать больше секунд я пытался вернуть тип данных unsigned long long, но переменная всегда переполняется одним и тем же значением (2147).
Не могли бы вы объяснить, почему компилятор конвертирует в unsigned long long "a priori" и почему даже при unsigned long long он переполняется при одном и том же значении?
Есть ли способ написать функцию Elapsed () лучше, чтобы предотвратить переполнение?