在运行一个为MIPS编译的程序时,我偶然发现了一个非常奇怪的问题。下面的代码片段用于获取时间纪元,并将其以微秒精度存储在unsigned long long变量中。
这个变量能够存储我用sizeof(unsigned long long)检查过的8个字节。
这段代码打印出来很奇怪:
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);它给出了以下输出:
>> Times is now 484305845 , time since epoch in seconds is: 1357751315但是,当我将计算分成不同的行时,它就可以工作了!
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);输出为:
Times is now 1357751437422143 , time since epoch in seconds is: 1357751437那么,这是否只是巧合呢?例如,我是否损坏了内存,或者实际上在什么地方超出了内存?也许是MIPS编译器的问题?如有任何帮助,我们不胜感激!
发布于 2013-01-10 01:19:34
microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec;tv_sec是较小的整数类型(time_t,可能是int或long),因此
time_camera.tv_sec * 1000000溢出。使用后缀为常量指定适当的类型
time_camera.tv_sec * 1000000ULL在……里面
microtime = time_camera.tv_sec;
microtime = microtime * 1000000;乘法是在unsigned long long上执行的,因为一个操作数(microtime)已经具有该类型,所以另一个操作数被转换为该类型。
发布于 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
https://stackoverflow.com/questions/14242735
复制相似问题