Сложение между Integer и Float...., что приводит к нулю
Я делал операцию в C++ над структурой таймера Linux, предоставленной интерфейсом "clock_gettime(CLOCK_MONOTONIC, &CurrentTime)"
#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
1 ответ
В соответствии:
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, который будет "обтекать".