警告:从“long int”转换为“double”可能会改变其值

cat*_*eof 5 c++ linux g++ compiler-warnings

我的代码如下:

#include <iostream>
#include <sys/time.h>
using namespace std;

int main(int argc, char** argv) {
                if(argv[0])
                        argc++;

                struct timeval m_timeEnd, m_timeCreate, m_timeStart;
        long mtime, alltime, seconds, useconds;

                gettimeofday(&m_timeStart,NULL);
                sleep(3);
                gettimeofday(&m_timeCreate,NULL);
                sleep(1);

        gettimeofday(&m_timeEnd, NULL);
        seconds  = m_timeEnd.tv_sec  - m_timeStart.tv_sec;
        useconds = m_timeEnd.tv_usec - m_timeStart.tv_usec;

        mtime = (long) (((seconds) * 1000 + useconds/1000.0) + 0.5);
        seconds = useconds = 0;
        seconds  = m_timeEnd.tv_sec  - m_timeCreate.tv_sec;
        useconds = m_timeEnd.tv_usec - m_timeCreate.tv_usec;
        alltime = (long) (((seconds) * 1000 + useconds/1000.0) + 0.5);

        printf("IN=%ld ALL=%ld milsec.\n", mtime, alltime);

}
Run Code Online (Sandbox Code Playgroud)

我正在编译

g++ -W -Wall -Wno-unknown-pragmas -Wpointer-arith -Wcast-align -Wcast-qual -Wsign-compare -Wconversion -O -fno-strict-aliasing

我有一些警告需要消除。如何?

a1.cpp:21: warning: conversion to 'double' from 'long int' may alter its value
a1.cpp:21: warning: conversion to 'double' from 'long int' may alter its value
a1.cpp:25: warning: conversion to 'double' from 'long int' may alter its value
a1.cpp:25: warning: conversion to 'double' from 'long int' may alter its value
Run Code Online (Sandbox Code Playgroud)

das*_*ght 0

这应该有效:

mtime = (long)(((long long)seconds*1000000 + useconds + 500)/1000);
Run Code Online (Sandbox Code Playgroud)

alltime以同样的方式转换表达式。

您看到警告的原因是您的表达式从 long 转换为 double 并返回以进行数学计算。您可以通过稍微重新调整表达式以完全保持在整数类型内来避免这种情况。请注意转换为long long以避免溢出(谢谢,尼克)。

编辑您可以进一步简化并消除转换:

mtime = seconds*1000 + (useconds + 500)/1000;
Run Code Online (Sandbox Code Playgroud)