请选择 进入手机版 | 继续访问电脑版

雨滴科技技术论坛

 找回密码
 立即注册
查看: 270|回复: 3

gettimeofday取毫秒的溢出问题

[复制链接]

312

主题

1595

帖子

6160

积分

论坛元老

Rank: 8Rank: 8

积分
6160
扫一扫,手机访问本帖
发表于 2020-8-20 16:02:03 | 显示全部楼层 |阅读模式
gettime.png
很奇怪,获取到秒数1597907007,乘1000,得到的数反而变小了,得到179172888,变成了9位数

gettime2.png

百度了一下,还是32位系统的缘故:
出现此问题,显然是溢出了。由于tv.tv_sec的类型是long,而long在32位的机器上的范围为−2,147,483,648 -> 2,147,483,647。
我们得到的时间戳1597907007*1000,十三位了,大于最大范围,所以溢出了。


更改方式:
改成long long 或者double


  1. long long getCurrentTime() //得到当前时间ms
  2. {
  3.     struct timeval tv;
  4.     gettimeofday(&tv,NULL);
  5.     long long sec = (long long)tv.tv_sec*1000;
  6.     long long usec = (long long)tv.tv_usec/1000;
  7.     LOGD("tv_sec: %lld tv_susc: %lld",sec,usec);
  8.     LOGD("tv_sec: %ld tv_susc: %ld",tv.tv_sec,tv.tv_usec);
  9.     return (sec) + (usec);
复制代码
这里注意要强制类型转换,否则还是会出错

结果:
gettime3.png




可以看到时间戳是正确的了










回复

使用道具 举报

27

主题

80

帖子

469

积分

中级会员

Rank: 3Rank: 3

积分
469
发表于 2020-8-25 16:32:35 | 显示全部楼层
点个赞吧
致力于打造优良品质的工业智能终端——小雨滴
电话:18278808009 微信/QQ:2850906961
回复

使用道具 举报

483

主题

1917

帖子

7750

积分

论坛元老

Rank: 8Rank: 8

积分
7750
发表于 2020-9-4 18:52:07 | 显示全部楼层
为什么要乘以1000呢
回复 支持 反对

使用道具 举报

312

主题

1595

帖子

6160

积分

论坛元老

Rank: 8Rank: 8

积分
6160
 楼主| 发表于 2020-9-7 09:14:14 | 显示全部楼层
max 发表于 2020-9-4 18:52
为什么要乘以1000呢

s转为ms,所以要乘以1000
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
在线咨询
咨询热线
0755-26787502-8006/8016
扫一扫二维码
直接访问本站

QQ|Archiver|手机版|小黑屋|雨滴科技  

GMT+8, 2020-10-25 18:25 , Processed in 0.081509 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表