警告:从'long int'转换为'double'可能会更改其值
warning: conversion to 'double' from 'long int' may alter its value
我的代码如下:
#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);
这将删除任何警告。。。
相关文章:
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 从 long 转换C++位集构造函数的复杂性是多少?
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- 替换 c++ 中的 c 样式强制转换 (long&)
- 如何在<typename> <long> 不更改给定代码的情况下将自定义向量与 STL 向量相互转换?
- 隐式转换会丢失整数精度:'long' 到 'int'
- 为什么 int 到长 long int 的隐式转换在 C++ 中给出了意想不到的答案?
- 是否允许在模板专用化时从int转换为long(应该编译此代码)
- 将long-long的数组转换为字符串
- C++11自动.从float转换为long
- C++ 将 int 转换为 *LONG
- 将函数从WCHAR_T数组转换为long int
- 将无符号字符数组强制转换为long-long
- 将 QByteArray 转换为“long”会为相同的输入输出不同的结果
- 如何将双精度转换为标准'long double'
- 将C++字符串变量转换为long
- 为什么从无符号long-long转换为double会导致数据丢失
- C++无法将'long double'转换为'long double*',因为参数'1'为"long
- 在C++中,将double转换为long的类型返回了不正确的值