整数和浮点数之间的加法....导致零
Addition between Integer and Float.... resulting in a Zero
我一直在用C++对接口"clock_gettime(CLOCK_MONOTONIC, &CurrentTime)"[=25提供的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
行中:
TimeNow = (28220 * 1000000) + (461189000 * 0.001);
(28220 * 1000000)
部分是使用 int
s 计算的,并且(对于 32 位 int
)溢出给出了不正确的值(可能是 -1844771072)。
(461189000 * 0.001)
部分是使用 double
s 计算的,因为 0.001
双常数,给出 461189.0 作为 double
。
然后将两者相加,得到负值 double
...当负值 double
转换为 unsigned long long
以分配给 TimeNow
时,它被转换为 0,可能是因为这是其范围内最接近任何负数的值。这不同于将负整数类型转换为无符号整数,后者 "wrap around".
我一直在用C++对接口"clock_gettime(CLOCK_MONOTONIC, &CurrentTime)"[=25提供的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
行中:
TimeNow = (28220 * 1000000) + (461189000 * 0.001);
(28220 * 1000000)
部分是使用 int
s 计算的,并且(对于 32 位 int
)溢出给出了不正确的值(可能是 -1844771072)。
(461189000 * 0.001)
部分是使用 double
s 计算的,因为 0.001
双常数,给出 461189.0 作为 double
。
然后将两者相加,得到负值 double
...当负值 double
转换为 unsigned long long
以分配给 TimeNow
时,它被转换为 0,可能是因为这是其范围内最接近任何负数的值。这不同于将负整数类型转换为无符号整数,后者 "wrap around".