首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unsigned long long在C中表现奇怪

unsigned long long在C中表现奇怪
EN

Stack Overflow用户
提问于 2013-01-10 01:16:41
回答 2查看 713关注 0票数 1

在运行一个为MIPS编译的程序时,我偶然发现了一个非常奇怪的问题。下面的代码片段用于获取时间纪元,并将其以微秒精度存储在unsigned long long变量中。

这个变量能够存储我用sizeof(unsigned long long)检查过的8个字节。

这段代码打印出来很奇怪:

代码语言:javascript
复制
unsigned long long microtime=0;
struct timeval time_camera = { .tv_sec=0, .tv_usec=0 };
gettimeofday(&time_camera,NULL);
microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec;
printf("Times is now %llu , time since epoch in seconds is: %lu\n", microtime, time_camera.tv_sec);

它给出了以下输出:

代码语言:javascript
复制
>> Times is now 484305845 , time since epoch in seconds is: 1357751315

但是,当我将计算分成不同的行时,它就可以工作了!

代码语言:javascript
复制
unsigned long long microtime=0;
struct timeval time_camera = { .tv_sec=0, .tv_usec=0 };
gettimeofday(&time_camera,NULL);
microtime = time_camera.tv_sec;
microtime = microtime * 1000000;
microtime = microtime  + time_camera.tv_usec;
printf("Times is now %llu , time since epoch in seconds is: %lu\n", microtime, time_camera.tv_sec);

输出为:

代码语言:javascript
复制
Times is now 1357751437422143 , time since epoch in seconds is: 1357751437

那么,这是否只是巧合呢?例如,我是否损坏了内存,或者实际上在什么地方超出了内存?也许是MIPS编译器的问题?如有任何帮助,我们不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-10 01:19:34

代码语言:javascript
复制
microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec;

tv_sec是较小的整数类型(time_t,可能是intlong),因此

代码语言:javascript
复制
time_camera.tv_sec * 1000000

溢出。使用后缀为常量指定适当的类型

代码语言:javascript
复制
time_camera.tv_sec * 1000000ULL

在……里面

代码语言:javascript
复制
microtime = time_camera.tv_sec;
microtime = microtime * 1000000;

乘法是在unsigned long long上执行的,因为一个操作数(microtime)已经具有该类型,所以另一个操作数被转换为该类型。

票数 9
EN

Stack Overflow用户

发布于 2013-01-10 01:19:12

看起来在你给你的unsigned long long赋值之前,你只是在进行size_t数学运算。尝试将ULL放在常量之后。

另一种方法是(unsigned long long) 1000000。只要您在乘法中至少有一个操作数上有此类型,您就可以确保结果将是优先级较高的类型。隐式类型转换优先级规则为(按从高到低的顺序):

long double => double => float => unsigned long long => long long => unsigned long => long => unsigned int => int

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14242735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档