Сложение между 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, который будет "обтекать".

Другие вопросы по тегам