-5

我一直在 C++ 中对接口“clock_gettime(CLOCK_MONOTONIC, &CurrentTime)”提供的 Linux 定时器结构进行操作

#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 编译器完成的

代码片段可以在这里找到 http://rextester.com/XRR83683

4

1 回答 1

0

在行中:

TimeNow = (28220 * 1000000) + (461189000 * 0.001);

(28220 * 1000000)部分是使用ints 计算的,并且(使用 32 位int)溢出会给出不正确的值(可能是 -1844771072)。

由于双常数,该(461189000 * 0.001)部分使用doubles 计算,将0.001461189.0 作为double.

然后将两者相加,给出一个负值double......当该负值double转换unsigned long long为赋值为 时TimeNow,它被转换为 0,可能是因为这是其范围内与任何负数最接近的值。这与将负整数类型转换为无符号类型不同,后者会“环绕”。

于 2016-10-10T00:27:48.763 回答