警告:从'long int'转换为'double'可能会更改其值

warning: conversion to 'double' from 'long int' may alter its value

本文关键字:转换 long int 警告 double      更新时间:2023-10-16

我的代码如下:

#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);
}

我正在使用进行编译

g++-W-Wall-Wno未知杂注-Wpointer arith-Wcast align-Wcast qual-Wsign compare-Wconversion-O-fno严格混叠

我有一些警告需要消除。怎样

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

如果你真的不需要值四舍五入到最接近的毫秒-也就是说,如果你能承受高达1毫秒而不是1/2毫秒的不准确度-你可以简单地写

mtime = seconds * 1000 + useconds / 1000;

否则,必须是

mtime = seconds * 1000 + (useconds / 500 + 1) / 2;

编辑:是否。请参阅评论。

也更改它:

mtime = seconds * 1000 + useconds/1000;

区别只是它没有四舍五入到最接近的微秒(它向下四舍五舍五入)
无论如何,没有那么准确的计时器。

如果你真的必须要有额外的精度(四舍五入到最近的,而不是四舍五进到地板)。

// Add 500 to useconds so that when we divide by 1000 we effectively
// round to nearest rather than truncate thus rounding to floor
mtime = seconds * 1000 + (useconds + 500) / 1000;

这应该有效:

mtime = (long)(((long long)seconds*1000000 + useconds + 500)/1000);

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

您看到这些警告的原因是,您的表达式从long转换为double,然后返回进行计算。您可以通过稍微重新洗牌表达式来避免这种情况,使其完全保持在积分类型中。注意转换为long long以避免溢出(谢谢,Nick)。

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

mtime = seconds*1000 + (useconds + 500)/1000;

巧妙的方法是铸造。。。

mtime = (long) (((double)seconds * 1000.0 + (double)useconds/1000.0) + 0.5);

这将删除任何警告。。。